Я не могу возобновить загрузку по FTP, используя curl. Он всегда добавляет полный локальный файл к частично загруженному удаленному файлу, в результате чего удаленный файл становится больше локального файла.
Мне интересно, если я пропустил вариант или если curl_multi
имеет какое-либо отношение к этому?
$resume = true
$filesize
текущий размер удаленного файла в байтах, полученный с помощью отдельного ftp-запроса curl.
Я пробовал с CURLOPT_FTPAPPEND
опция вкл и выкл.
Любая помощь будет великолепна, так как я бьюсь головой о стену, пытаясь понять это 🙂
...
$ch[$i] = curl_init();
$file = fopen($local_file, 'rb');
if ($resume)
{
curl_setopt($ch[$i], CURLOPT_RESUME_FROM, $filesize);
// move file position forward to resume
fseek($file, $filesize);
}
curl_setopt($ch[$i], CURLOPT_URL, $remote_file);
curl_setopt($ch[$i], CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch[$i], CURLOPT_USERPWD, "{$ftp['user']}:{$ftp['pass']}");
curl_setopt($ch[$i], CURLOPT_UPLOAD, true);
curl_setopt($ch[$i], CURLOPT_HEADER, false);
curl_setopt($ch[$i], CURLOPT_INFILE, $file);
curl_setopt($ch[$i], CURLOPT_INFILESIZE, filesize($local_file));
curl_multi_add_handle($mh, $ch[$i]);
...
ОБНОВЛЕНО
Так как часы поиска в Google не помогли, я придумал простую работу вокруг.
Существует не так много сообщений об использовании curl для возобновления загрузки, поэтому я надеюсь, что это поможет кому-то еще сэкономить время.
Это всего лишь одна строка, используя fseek()
, но это обычно так;)
ОБНОВЛЕНО
Так как часы поиска в Google не помогли, я придумал простую работу вокруг.
Существует не так много сообщений об использовании curl для возобновления загрузки, поэтому я надеюсь, что это поможет кому-то еще сэкономить время.
использование fseek()
переместить позицию файла перед вызовом curl_setopt($ch[$i], CURLOPT_INFILE, $file);
…
$ch[$i] = curl_init();
$file = fopen($local_file, 'rb');
if ($resume)
{
curl_setopt($ch[$i], CURLOPT_RESUME_FROM, $filesize);
// move file position forward to resume
fseek($file, $filesize);
}
curl_setopt($ch[$i], CURLOPT_URL, $remote_file);
curl_setopt($ch[$i], CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch[$i], CURLOPT_USERPWD, "{$ftp['user']}:{$ftp['pass']}");
curl_setopt($ch[$i], CURLOPT_UPLOAD, true);
curl_setopt($ch[$i], CURLOPT_HEADER, false);
curl_setopt($ch[$i], CURLOPT_INFILE, $file);
curl_setopt($ch[$i], CURLOPT_INFILESIZE, filesize($local_file));
curl_multi_add_handle($mh, $ch[$i]);
...
Других решений пока нет …