从 PHP 5.5 升级到 5.6 后,cURL 文件上传不再有效

2022-08-30 15:29:29

我有一个cURL上传,从PHP 5.5升级到5.6后失败:

$aPost = array(
    'file' => "@".$localFile,
    'default_file' => 'html_version.html',
    'expiration' => (2*31*24*60*60)
)

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiurl);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
curl_setopt($ch, CURLOPT_POSTFIELDS, $aPost);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$sResponse = curl_exec ($ch);

该文件在目标系统上似乎为空。


答案 1

实际上,我在开始提问时找到了答案。在 PHP 5.5 中,curl 包含了一个新的变量:在 PHP 5.5 中,此变量默认设置为“,在 PHP 5.6 中,此变量将切换为默认值。CURLOPT_SAFE_UPLOADfalsetrue

出于安全原因,这将阻止“@”上传修饰符工作 - 用户输入可能包含恶意上传请求。您可以使用该类在设置为 或 时上传文件(如果您确定变量是安全的,则可以将CURLFileCURLOPT_SAFE_UPLOADtrueCURLOPT_SAFE_UPLOADfalse

 curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);

以下是让我朝着正确方向搜索的信息来源:http://comments.gmane.org/gmane.comp.php.devel/87521

在更改的函数中也提到了它:http://php.net/manual/en/migration56.changed-functions.php 但不是在向后不兼容的更改中,真的让我绊倒了......


答案 2

只需对 PHP 5.5 或更高版本进行以下更改

而不是仅仅使用"@" . $localFilenew CurlFile($localFile)

并设置

curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);

推荐