因为各种原因需要,目前有这个需求。php需要接收前端传过来的文件,然后包装成文件流发送到第三方接口,等于是php做一个中转的作用。网上查了很多资料或多或少都有点问题,这里记录一下方便以后自己查看。
第三方java端的接收参数是:@RequestPart("file") MultipartFile file
关于php如何接收前端传过来的文件流就不过多说明了,各种办法都有,这边是用的layui上传插件来进行该操作的
layui.use(['upload'], function () { var upload = layui.upload; upload.render({ elem: '#imgHead' , url: "{:url('file.File/uploadFile')}" , before: function (obj) { obj.preview(function (index, file, result) { $('#avatarPreview').attr('src', result); }); } , done: function (res) { if(!res.success){ Swal.fire({text: '头像更新失败:'+res.data.msg,icon: 'error',confirmButtonText: '好的' }) return false; } var userInfo = { "id": "{$loginUser['loginUser']['userId']}", "logo": res.data.fileUrl } $.post("{:url('user.UserInfo/updateAvatar')}", userInfo, function (res1) { if (res1.success) {Swal.fire({ text: "头像更新成功", icon: 'success', confirmButtonText: '好的'}) } else {Swal.fire({ text: '头像更新失败,请稍后重试', icon: 'error', confirmButtonText: '好的'}) } }); } , error: function () { } }); });
php端一句代码就能获取到具体传过来的文件数据
然后用各种办法给保存到临时文件里。不知道还有没有其他不需要保存临时文件的办法,我只写我自己是如何实现的,可能不是最优解,能用就行。
这里使用的是TP6的方法,当然也是可以用其他任何能把文件保存到本地的方法,只要能保存到本地并获取到地址即可。
$file = request()->file('file');$severname = \think\facade\Filesystem::disk('public')->putFile('image/', $file);
最后利用CURLFile把刚刚保存的文件给转换为上传对象,封装后传给第三方接口
#将临时文件进行处理并使用后端上次接口上传 $url = "http://localhost:8000/api/sysFileInfo/upload"; $data = [ "file"=> new \CURLFile("storage/".$severname), "secretFlag"=> "Y" ]; //post请求 $res = HttpTool::post($url,$data); #删除本地该图片 unlink("storage/".$severname); #返回图片链接 if($res['success']){ return $res['data']['fileId']; }else{ return $res; }
static function post($url, $msg) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_POSTFIELDS, $msg); curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: multipart/form-data']); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec($curl); curl_close($curl); return json_decode($res, true); }
自此结束,里面的post参数可不可以增改,请自行尝试。
来源地址:https://blog.csdn.net/zyx7653296/article/details/127783088