【问题标题】:File downloaded by curl but not by node.js由 curl 但不是由 node.js 下载的文件
【发布时间】:2017-04-20 21:40:14
【问题描述】:

所以我试图通过nodejs下载一个在浏览器中可以正常打开的文件,甚至可以在curl等工具中正常下载。 但是 nodejs 只是由于某种原因无法下载文件。我尝试通过节点中的request 模块和名为download-cli 的节点cli 模块下载文件。它们都以 400 或 404 响应失败,但文件可以通过 curl 等常规工具正常下载。

可能是什么问题?我已经尝试将用户代理设置为 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

【问题讨论】:

  • 您能否提供用于从 Node 下载文件的代码?如果我们不知道您是如何尝试这样做的,则无法回答。
  • @serge1peshcoff 我尝试通过各种代码下载,例如使用本机 http 模块、使用请求模块等。该代码在 99% 的情况下运行良好,但在这里失败了。查看失败的实际原因的答案。

标签: node.js powershell http curl http-headers


【解决方案1】:

好的,所以我尝试通过节点的本机 http 模块下载文件,尝试通过流行的 request 模块下载,并尝试通过名为 download-cli 的基于节点的 cli 工具下载。他们每个人的反应都是一样的。 所以我启动了 Wireshark 并试图查看请求的不同之处,结果发现像 curlInvoke-WebRequest 这样的工具在发出 GET 请求之前会避开路径,但节点的本机模块不会这样做。那是唯一的区别。使用转义的 url 可以正常工作。

Invoke-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-?>445@6:0-A8=E@>=870F88-notifier-sim-:0@BK-?>4:;NG5=85-bluetooth-4;O-android-apple-iphone.jpg_640x640.jpg HTTP/1.1

【讨论】:

    【解决方案2】:

    你为什么不这样做:

    $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
    

    【讨论】:

      猜你喜欢
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 2022-10-15
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      相关资源
      最近更新 更多