起因:
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));
网友评论