PHP7.4 使用 CURLFile 上传文件失败
File uploads using CURLFile fails in PHP7.4
我查询了一个 API,我向其上传了文件,但是当我 post 使用 PHP7.4 时没有上传任何文件,但是,它与 PHP7 一起工作正常.3.
这是我的代码片段:
public function upload($opts = array())
{
$files = array();
foreach($opts['files'] as $i => $file)
{
$files['files[' . $i . ']'] = new CURLFile($file);
}
unset($opts['files']);
$data = array_merge($files, array( "data" => json_encode($opts)));
$response = self::curlRequest( "https://api.example.com/", $data);
return $response;
}
public static function curlRequest($url, $data)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_FAILONERROR, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($curl, CURLOPT_TIMEOUT, 300);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 300);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
所以上传函数接受一个多维值数组,包括一个索引为 'files' 的文件数组。它遍历文件,创建 CURLFile objects 然后 post 将这些与其余数据一起发送到 API.
使用PHP7.4,API服务器上的全局变量$_REQUEST和$_FILES始终为空。使用 PHP7.3,这些变量将按预期填充发送的数据。
在 https://www.php.net/manual/en/migration74.new-features.php 上声明:
CURLFile now supports stream wrappers in addition to plain file names, if the extension has been built against libcurl >= 7.56.0.
libcurl 版本为 7.58。
已在此处提交相关错误报告 https://bugs.php.net/bug.php?id=79013 关于 Content-Length header 丢失导致无法上传文件,但似乎 PHP 团队认为问题出在使用服务器,而不是 PHP.
有人知道如何使用 PHP7.4 上传文件吗?
版本 PHP 7.4.4 修复了这个问题。看来确实是个bug。
我查询了一个 API,我向其上传了文件,但是当我 post 使用 PHP7.4 时没有上传任何文件,但是,它与 PHP7 一起工作正常.3.
这是我的代码片段:
public function upload($opts = array())
{
$files = array();
foreach($opts['files'] as $i => $file)
{
$files['files[' . $i . ']'] = new CURLFile($file);
}
unset($opts['files']);
$data = array_merge($files, array( "data" => json_encode($opts)));
$response = self::curlRequest( "https://api.example.com/", $data);
return $response;
}
public static function curlRequest($url, $data)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_FAILONERROR, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
curl_setopt($curl, CURLOPT_TIMEOUT, 300);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 300);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
所以上传函数接受一个多维值数组,包括一个索引为 'files' 的文件数组。它遍历文件,创建 CURLFile objects 然后 post 将这些与其余数据一起发送到 API.
使用PHP7.4,API服务器上的全局变量$_REQUEST和$_FILES始终为空。使用 PHP7.3,这些变量将按预期填充发送的数据。
在 https://www.php.net/manual/en/migration74.new-features.php 上声明:
CURLFile now supports stream wrappers in addition to plain file names, if the extension has been built against libcurl >= 7.56.0.
libcurl 版本为 7.58。
已在此处提交相关错误报告 https://bugs.php.net/bug.php?id=79013 关于 Content-Length header 丢失导致无法上传文件,但似乎 PHP 团队认为问题出在使用服务器,而不是 PHP.
有人知道如何使用 PHP7.4 上传文件吗?
版本 PHP 7.4.4 修复了这个问题。看来确实是个bug。