美文网首页
php借助curl另一种的文件上传方式

php借助curl另一种的文件上传方式

作者: dwq1666666 | 来源:发表于2020-12-30 19:13 被阅读0次

起因:
tp项目突然无法上传文件到oss,找了很久的问题没有找到,然后使用curl + charles抓包的方式看到了具体的错误信息,百度才找到了问题所在,是因为升级了swoole的扩展导致的,在swoole2.5.4之前,SWOOLE_HOOK_CURL默认是不开启的,2.5.4之后默认开启(开启了就不支持文件上传了),然后修改协程的flags项为FLAGS=SWOOLE_HOOK_ALL ^ SWOOLE_HOOK_CURL解决了问题

阅读源码发现另外一种文件上传方式

客户端:

$url = "http://127.0.0.1/api/test/upload";

        $readFunction = function ($ch,$fp,$len){
            var_dump($len);
            $data = fgets($fp,$len);
            //var_dump($data);
            return $data;
        };

        $file = './public/static/bringgoods/F2002284.png';
        if(!file_exists($file)){
            throw new Exception('文件不存在');
        }
        $fp = fopen($file,'r');


        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL , $url); // 上传url
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 请求返回内容使用变量接收
        curl_setopt($ch, CURLOPT_UPLOAD, 1);    // 表示是上传
        curl_setopt($ch,CURLOPT_PROXY,'127.0.0.1:8888'); // 设置代理抓包服务器
        curl_setopt($ch, CURLOPT_INFILE, $fp);  // 设置文件句柄
        curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file)); // 设置文件长度
        curl_setopt($ch, CURLOPT_READFUNCTION, $readFunction);  // 读取文件函数

        $output = curl_exec($ch);
        curl_close($ch);
        echo $output;
        return ;

服务端:

$content = request()->getInput(); // 相当于 file_get_content('php://input');
// var_dump($content);
var_dump(file_put_contents(__DIR__.'a.png',$content));

相关文章

网友评论

      本文标题:php借助curl另一种的文件上传方式

      本文链接:https://www.haomeiwen.com/subject/gmahoktx.html