2017-04-20 55 views
0

所以我試圖通過nodejs下載一個文件,在瀏覽器中打開罰款,甚至在curl等工具中下載罰款。 但是,由於某種原因,nodejs僅僅因爲下載文件而失敗。我嘗試通過節點中的request模塊並通過名爲download-cli的節點cli模塊下載文件。他們都失敗了,或者400或404響應,但文件通過像curl這樣的常規工具進行下載。curl下載的文件,但不是由node.js下載

可能是什麼問題?我曾嘗試將用戶代理設置爲Firefox的打開方式(它打開的很好),但這並不能解決問題。我假設問題不在於用戶代理,因爲curl沒有自己的用戶代理。

在考慮中的URL可以是從alicdn任何URL,但讓我們這一個作爲一個例子: https://ae01.alicdn.com/kf/HTB1ftVmPVXXXXXUXVXXq6xXFXXXG/Langtek-smart-watch-gt12-часы-поддержка-синхронизации-notifier-sim-карты-подключение-bluetooth-для-android-apple-iphone.jpg_640x640.jpg

下面是由通過節點download-cli工具,並在的powershell的Invoke-WebRequest工具運行上述URL的響應。

PS C:\code> download https://ae01.alicdn.com/kf/HTB1ftVmPVXXXXXUXVXXq6xXFXXXG/Langtek-smart-watch-gt12-часы-поддержка-син 
хронизации-notifier-sim-карты-подключение-bluetooth-для-android-apple-iphone.jpg_640x640.jpg 
Couldn't connect to https://ae01.alicdn.com/kf/HTB1ftVmPVXXXXXUXVXXq6xXFXXXG/Langtek-smart-watch-gt12-часы-поддержка-синхронизации-notifier-sim-карты-подключение-bluetooth-для-android-apple-iphone.jpg_640x640.jpg (404) 
PS C:\code> curl https://ae01.alicdn.com/kf/HTB1ftVmPVXXXXXUXVXXq6xXFXXXG/Langtek-smart-watch-gt12-часы-поддержка-синхрон 
изации-notifier-sim-карты-подключение-bluetooth-для-android-apple-iphone.jpg_640x640.jpg 


StatusCode  : 200 
StatusDescription : OK 
Content   : {255, 216, 255, 224...} 
RawContent  : HTTP/1.1 200 OK 
        X-Application-Context: fileserver2-download:prod:7001 
        From-Req-Dns-Type: NA,NA 
        SERVED-FROM: 72.247.178.95 
        Connection: keep-alive 
        Network_Info: DE_FRANKFURT_16509 
        Timing-Allow-Ori... 
Headers   : {[X-Application-Context, fileserver2-download:prod:7001], [From-Req-Dns-Type, NA,NA], [SERVED-FROM, 72.247.178.95], 
        [Connection, keep-alive]...} 
RawContentLength : 114927 
+0

你能提供您使用下載代碼來自Node的文件?如果我們不知道你是如何嘗試這樣做的話,這是不可能的。 – serge1peshcoff

+0

@ serge1peshcoff我曾嘗試通過各種類似的代碼使用本地http模塊,使用請求模塊和其他一些下載。代碼在99%的情況下工作正常,但在這裏失敗。看到這個失敗的實際原因的答案。 – ArsalanDotMe

回答

0

好了,所以我試圖通過節點的本地HTTP模塊下載文件,我試圖通過流行request模塊下載和我試圖通過所謂download-cli基於節點CLI工具下載。他們每個人都有同樣的迴應。 因此,我啓動了Wireshark並試圖準確查看請求的不同位置,結果發現在進行GET請求之前,curlInvoke-WebRequest等工具會逃避路徑,但節點的本地模塊不會這樣做。這是唯一的區別。使用轉義的網址可以正常工作。

調用-的WebRequest的GET路徑:

GET /kf/HTB1ftVmPVXXXXXUXVXXq6xXFXXXG/Langtek-smart-watch-gt12-%D1%87%D0%B0%D1%81%D1%8B-%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%B0-%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8-notifier-sim-%D0%BA%D0%B0%D1%80%D1%82%D1%8B-%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-bluetooth-%D0%B4%D0%BB%D1%8F-android-apple-iphone.jpg_640x640.jpg HTTP/1.1 

節點的GET路徑:

GET /kf/HTB1ftVmPVXXXXXUXVXXq6xXFXXXG/Langtek-smart-watch-gt12-G0AK-?>[email protected]:[email protected]>=870F88-notifier-sim-:[email protected]?>4:;NG5=85-bluetooth-4;O-android-apple-iphone.jpg_640x640.jpg HTTP/1.1 
0

爲什麼你沒有做到這一點:

$url='https://ae01.alicdn.com/kf/HTB1ftVmPVXXXXXUXVXXq6xXFXXXG/Langtek-smart-watch-gt12-%D1%87%D0%B0%D1%81%D1%8B-%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%B0-%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8-notifier-sim-%D0%BA%D0%B0%D1%80%D1%82%D1%8B-%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-bluetooth-%D0%B4%D0%BB%D1%8F-android-apple-iphone.jpg_640x640.jpg' 
Invoke-WebRequest -Uri $url -OutFile C:\temp\android-apple-iphone.jpg_640x640.jpg