如何使用 PHP cURL 发布带有进度的文件

ial*_*xpw 5 php post curl progress

我目前正在运行一个个人文件上传网站,它大致执行以下操作;

  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);
Run Code Online (Sandbox Code Playgroud)

这会用进度调用“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);
}
Run Code Online (Sandbox Code Playgroud)

问题是,我得到下面的输出;

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
Run Code Online (Sandbox Code Playgroud)

这似乎显示上传量在增加(这没关系),但总上传量为 0。我在网上尝试了很多例子,但我无法弄清楚为什么要上传的总量总是0。我尝试设置一个Content-Length,尽管它是相同的。

如果上述内容有问题,任何帮助将不胜感激。

谢谢!

小智 0

您好,很抱歉两年后的回复,但正在努力!

可以上传,但正如前面提到的,我们在本例中没有总文件大小。

如果可能的话,最简单的方法是在回调函数上获取文件大小,例如全局:

function progressCall($ch, $dltotal, $dlnow, $uptotal, $upnow) {
    // You will get this before with | $fsize = filesize($thefile);
    global $fsize;
    
    $percent = round($upnow / $fsize * 100);
    echo $percent . ' % downloaded';
}
Run Code Online (Sandbox Code Playgroud)