Как отправить файл с PHP cURL с прогрессом - PullRequest
2 голосов
/ 14 января 2020

В настоящее время у меня есть личный сайт для загрузки файлов, который примерно выполняет следующие действия:

  1. Выбор файлов для загрузки через сайт
  2. PHP загрузка и архивирование файлов вместе
  3. Заархивированный файл отправляется через cURL на удаленный сервер хранения
  4. Предоставляется URL-адрес для обмена файлами

У меня проблема с шагом 3. В настоящее время у меня есть индикатор выполнения, пока файл загружается на веб-сайт, и я хотел бы, чтобы еще один процент отображал передачу cURL на сервер хранения. Я видел, что вы можете использовать CURLOPT_PROGRESSFUNCTION - но я не могу заставить его работать после долгих поисков.

Мой текущий код такой, как показано ниже;

// Prepare the POST data
$data = array(
    'file' => new CurlFile('/path/to/local.zip', 'application/zip', 'uploaded_archive.zip'),
    'upload_folder' => 'folder_name'
);

// Send the POST
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/upload.php");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progressCall');
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 160);
curl_setopt($ch, CURLOPT_TIMEOUT, 160);
$res = curl_exec($ch);
curl_close($ch);

Это вызывает " progressCall "с прогрессом, который для тестирования выглядит следующим образом;

// Function to save the output of progress from CURLOPT_PROGRESSFUNCTION
function progressCall($ch, $dltotal, $dlnow, $uptotal, $upnow) {
    $progress = "$ch/$dltotal/$dlnow/$uptotal/$upnow";
    file_put_contents('tmp/curlupload.txt', 'PERC: ' . $progress . "\n", FILE_APPEND);
}

Проблема в том, что я получаю вывод ниже;

https://gist.github.com/ialexpw/6160e32495d857cc0d8984373f3808ae

PERC: Resource id #15/0/0/0/65532
PERC: Resource id #15/0/0/0/65532
PERC: Resource id #15/0/0/0/131064
PERC: Resource id #15/0/0/0/131064
PERC: Resource id #15/0/0/0/196596

Похоже, что загруженная сумма увеличивается (что в порядке), но имеет 0 для общей суммы загрузки. Я пробовал много примеров в Интернете, но я не могу понять, почему общая сумма для загрузки всегда равна 0. Я попытался установить Content-Length, хотя это то же самое.

Любая помощь будет признателен, если что-то не так с вышеуказанным.

Спасибо!

...