从PHP 5.5升级到5.6后,我的cURL上传失败了:
$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);
目标系统上的文件似乎是空的。
答案 0 :(得分:40)
实际上我在开始提问时找到了答案。在PHP 5.5中有一个包含curl的新变量:CURLOPT_SAFE_UPLOAD
默认情况下在PHP 5.5中设置为false
,并在PHP 5.6中切换为默认值true
。
这会阻止'@'上传修饰符出于安全原因而工作 - 用户输入可能包含恶意上传请求。您可以使用CURLFile
课程在CURLOPT_SAFE_UPLOAD
设置为true
时上传文件,或者(如果您确定变量是安全的,则可以将CURLOPT_SAFE_UPLOAD
切换为{{ 1}}手动):
false
以下是让我搜索正确方向的信息来源:http://comments.gmane.org/gmane.comp.php.devel/87521
在改变的功能中也提到了它:http://php.net/manual/en/migration56.changed-functions.php 但不是在落后的不相容的变化中,真的让我失望......
答案 1 :(得分:29)
只需对PHP 5.5或更高版本进行以下更改
而不是"@" . $localFile
只使用new \CURLFile($localFile)
并设置
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
答案 2 :(得分:9)
包含运行时检查以使您的代码与较低版本兼容,如下所示
$aPost = array(
'default_file' => 'html_version.html',
'expiration' => (2*31*24*60*60)
)
if ((version_compare(PHP_VERSION, '5.5') >= 0)) {
$aPost['file'] = new CURLFile($localFile);
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
} else {
$aPost['file'] = "@".$localFile;
}
$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);