在 PHP7.4 中使用 CURLFile 上传文件失败

问题描述 投票:0回答:1

我查询了一个上传文件的API,但是当我用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 对象,然后将这些对象和其他数据一起发布到 API 中。

在 PHP7.4 中,API 服务器上的全局变量 $_REQUEST 和 $_FILES 总是空的。在 PHP7.3 中,这些变量按照预期被填充了发送的数据。

https:/www.php.netmanualenmigration74.new-features.php 它指出。

CURLFile现在除了支持纯文件名外,还支持流包装,如果扩展名是根据libcurl >= 7.56.0建立的。

Libcurl的版本是7.58。

相关的错误报告已经提交到这里 https:/bugs.php.netbug.php?id=79013。 关于Content-Length头丢失导致无法上传文件的问题,但似乎PHP团队认为问题出在服务器上,而不是PHP。

有人知道如何使用 PHP7.4 上传文件吗?

php file-upload php-curl php-7.4
1个回答
0
投票

PHP7.4.4版本修正了这个问题。看来这确实是个bug。

© www.soinside.com 2019 - 2024. All rights reserved.