“Curl:(33) HTTP 服务器似乎不支持字节范围。无法恢复。”

Hug*_*lpz 6 gis curl wget web-crawler

给定一个在线文件,我可以通过网络浏览器下载该文件。

\n\n

curl在上面运行了一个

\n\n
mkdir -p ./data\ncurl -L -C - 'http://www.ngdc.noaa.gov/mgg/global/relief/ETOPO1/data/ice_surface/grid_registe\xe2\x80\x8c\xe2\x80\x8bred/netcdf/readme_etopo1_netcdf.txt' -o ./data/countries.zip \n
Run Code Online (Sandbox Code Playgroud)\n\n

我收到以下错误消息:

\n\n
\n

curl: (33) HTTP 服务器似乎不支持字节范围。无法恢复。\n

\n
\n\n

如何解决这个问题?欢迎其他下载工具。

\n\n
\n\n

笔记:

\n\n
    \n
  • -L: 遵循重定向
  • \n
  • -C -:继续之前未完成的下载
  • \n
\n\n
\n\n

编辑:当要下载的文件已经存在并且已经完成时,会出现此错误消息。它还会停止正在进行的脚本。我的要求是:

\n\n
    \n
  • 如果该文件不存在,则下载。
  • \n
  • 如果文件确实存在但不完整,则从停止处继续下载。
  • \n
  • 如果文件确实存在并且完整,则静默传递到下一个命令。(没有失败)
  • \n
\n\n

我怎么能这样做呢?

\n

nne*_*neo 7

我尝试运行此命令两次:

curl -L -C - 'http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_sovereignty.zip' -o countries.zip
Run Code Online (Sandbox Code Playgroud)

并得到以下输出:

$ curl -L -C - 'http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_sovereignty.zip' -o countries.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 5225k  100 5225k    0     0   720k      0  0:00:07  0:00:07 --:--:--  836k
$ curl -L -C - 'http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_0_sovereignty.zip' -o countries.zip
** Resuming transfer from byte position 5351381
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

所以,看起来“简历”工作正常。自从您在 5 月份发布了这个问题以来,cURL 完全有可能已经修复了他们的错误,或者有问题的网络服务器已经更新了对 HTTP 范围请求的支持。


正如您在评论中指出的,ngdc.noaa.gov 网站仍然存在该错误。我检查了我的卷曲,它也在做同样的事情。因此这个bug仍然存在于curl中。

我使用 Wireshark 检查了 HTTP 协议中发生的情况。基本上,当curl发出恢复已完成文件的请求时,服务器会发回HTTP 416错误(“请求的范围无法满足”)。对于naturalearthdata.com,他们使用的CDN 添加了一个Content-Range 标头,指定文件的确切长度。ngdc.noaa.gov 不添加此标头。请注意,根据 RFC 2616,在 HTTP 416 响应中添加 Content-Range 是可选的。

curl 使用 Content-Range 来确定下载是否完成。如果标头丢失,curl 会假定服务器不支持范围下载并输出该错误消息。

我已将此作为错误报告给 libcurl 邮件列表。我们会看看他们怎么说。与此同时,这里有两种可能的解决方法:

  • 使用不同的下载器。我aria2c经常使用,这是一个非常好的命令行下载实用程序,支持多个连接和恢复下载。它可以通过利用更多的连接来使您的下载速度更快(假设服务器支持它),并且我已经检查过 aria2c 不会遇到与curl相同的错误。
  • 用于curl -I <URL> | grep Content-Length | cut -d' ' -f 2获取文件的长度,并在运行之前检查下载的文件大小curl