我目前正在尝试使用 curl 从 esa 的 Copernicus / Sentinel 项目下载卫星图像。不幸的是,下载一直停止在 90% 左右,并且 php 脚本返回内部服务器错误 (500)。
因此,我想以特定的字节数恢复下载。似乎 esa 服务器只是忽略了 http-range-header (CURLOPT_RANGE) 并且 CURLOPT_RESUME_FROM 也没有改变任何东西。
如果我使用 Google Chrome 手动下载文件,下载也会中断,但会在一段时间后继续。
因此,如果谷歌浏览器可以恢复下载,curl 也应该能够做到这一点。对于如何做到这一点,我将不胜感激。
一些细节:
我要下载的文件在这里(420MB),要访问它,您需要在 scihub.esa.int/dhus/ 注册。
内容类型是application/octet-stream
我的代码:
$save_file = fopen($save_filepath, "w+");
$open_file = curl_init(str_replace(" ","%20", $url));
curl_setopt($open_file, CURLOPT_USERPWD, $username.":".$password);
curl_setopt($open_file, CURLOPT_TIMEOUT, 300);
curl_setopt($open_file, CURLOPT_FILE, $save_file);
curl_setopt($open_file, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($open_file, CURLOPT_PROGRESSFUNCTION, "trackprogress");
curl_setopt($open_file, CURLOPT_NOPROGRESS, false);
curl_exec($open_file);
curl_close($open_file);
fclose($save_file);
它非常适用于较小的文件(我已经用一些图像和 pdf 文件对其进行了测试),我还可以下载大部分卫星图像(下载了前 380MB)。我也尝试增加超时值,但脚本在 5 分钟之前就终止了。
我试过了curl_setopt($open_file, CURLOPT_RESUME_FROM, 1048576);
,curl_setopt($open_file, CURLOPT_RANGE, "1048576-");
但文件总是以相同的字节开头。
编辑:
我无法回答我的问题,但对于这种特定情况,我找到了一种解决方法。所以,如果有人读到这篇文章并且偶然想用 cURL 下载这些卫星图像,我就是这样做
的:和curl_setopt($open_file, CURLOPT_RESUME_FROM, $bytes_already_loaded);
可以跳过先前加载的字节并继续下载(这对于图像文件是不可能的)。因此,请使用此链接而不是图像文件。