文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

php curl文件流

2023-10-02 12:41

关注

php curl文件流

应用场景:

很多时候我们接第三方接口时遇到参数需要传文件流格式的字段,不能直接传图片链接的情况。又不能直接请求第三方接口,只能采取从客户端先请求我方接口,再通过我方服务器请求第三方接口的情况,需要我方把接收到的文件流原封不动上送给第三方。首先这个原封不动就很难,因为从客户端过来我们接收到的文件就已经是个文件数组了,而且后端无法获取客户端上传文件的本地路径,因为浏览器为了安全起见已经屏蔽了上送方的文件路径。
在这里插入图片描述
而且通过file方式上传的,通过post接收是接收不到的,php需要通过函数$_FILES才能接收到,下面是已经上传了两个参数,但post打印只有code参数。
在这里插入图片描述
而文件类型上传怎么能够获取到客户端完整的文件呢
在这里插入图片描述
其实这个tmp_name就是存放这个文件的临时路径,但是无法通过临时路径文件直接curl至第三方接口(其他服务器)。文件传输的思路就是客户端->我方服务器->第三方服务器;这里面有个注意的点是,不能通过临时文件直接上送至第三方服务器。
PHP上传文件类型的方法有
在文件字段的参数值前加上"@"符号,会将它识别为文件流类型,但是我并没有生效,我用的是另外一种用CURLFile类
。请求header的设置很多帖子说设置成content-type:multipart/form-data;但是我试了content-type:text/html;也是没问题的。如下代码:

    public function uploadPictureAction()    {        $post = $this->req->getPost();        // header('content-type:multipart/form-data;charset=utf8');        header('content-type:text/html;charset=utf8');        $ch = curl_init();        //加@符号curl就会把它当成是文件上传处理        $data = [            'code' => 111,            'file' =>  new CURLFile('/mnt/d/www/saas_api/web/upload/picture/1665994115.png'),//这里是固定服务器的文件路径,可以变更成接收的文件路径            // 'file' =>  '@'.'/mnt/d/www/saas_api/web/upload/picture/1665994115.png'        ];        curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:8086/signagreement/uploadSign");        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);        curl_setopt($ch, CURLOPT_POST, true);        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);        $result = curl_exec($ch);        curl_close($ch);        $this->jsonify([]);    }

以下是我的接收方法:

    public function uploadResultAction()    {        $raw = $this->req->getPost();        echo 'post2:'.json_encode($raw,JSON_UNESCAPED_UNICODE);        echo 'file2:'.json_encode($_FILES,JSON_UNESCAPED_UNICODE);   }

打印出来是这样的
在这里插入图片描述
完整示例是这样的:

    public function registerCompanyAction()    {        if(isset($_FILES['file']) && !$_FILES['file']['error']) { // 文件存在且不报错            $fileName = $_FILES['file']['name']; // 获取文件            $fileExtension = pathinfo($fileName); // 获取文件路径信息            $fileExtension = $fileExtension['extension']; // 获取文件后缀            $time = time(); // 根据时间戳区分            $destinationPath = $_SERVER['DOCUMENT_ROOT'].'/upload/picture/';// 目标文件夹            $newFileName = $destinationPath . $time . "." . $fileExtension; // 完整的url            if(move_uploaded_file($_FILES['file']['tmp_name'], $newFileName)) { // 移动文件到目标路径                echo("文件移动成功");            } else {                die("文件路径出错");            }        }        // header('content-type:multipart/form-data;charset=utf8');        header('content-type:text/html;charset=utf8');        $ch = curl_init();        //加@符号curl就会把它当成是文件上传处理        $data = [            'code' => 111,            'file' =>  new CURLFile($newFileName),            // 'file' =>  '@'.$newFileName        ];        curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:8086/signagreement/uploadSign");        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);        curl_setopt($ch, CURLOPT_POST, true);        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);        $result = curl_exec($ch);        curl_close($ch);        return $result;    }    ```

来源地址:https://blog.csdn.net/weixin_43928139/article/details/127449117

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯