php curl文件流

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;
    }
    ```
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP Laravel是一个行的Web开发框架,可以简化PHP开发过程并提供更好的开发体验。curl_setopt函数是PHP中用于设置cURL选项的函数,而cURL是一个用于发送和接收HTTP请求的库。下面是使用PHP Laravel和curl_setopt函数进行POST请求的示例。 1. 在Laravel中,首先要确保cURL扩展已经安装和启用。可以在php.ini文件中将以下行取消注释: extension=curl 2. 在Laravel应用中,可以使用Guzzle HTTP客户端库作为curl_setopt函数的替代方案。Guzzle库提供了更简单而又强大的HTTP请求功能,可以使用Laravel的composer工具进行安装: composer require guzzlehttp/guzzle 3. 使用Guzzle库进行POST请求的示例代码如下: ```php use GuzzleHttp\Client; $url = 'http://example.com/api'; // POST请求的URL $data = ['name' => 'John', 'email' => '[email protected]']; // POST请求的数据 $client = new Client(); $response = $client->post($url, ['form_params' => $data]); $statusCode = $response->getStatusCode(); // 获取响应的HTTP状态码 $responseData = $response->getBody()->getContents(); // 获取响应的内容 // 处理响应数据 ``` 在上面的示例中,使用Guzzle库创建了一个HTTP客户端实例$client。然后使用post方法发送POST请求,传递了请求的URL和POST数据。响应对象$response提供了一些方法来获取响应的状态码和内容。 使用curl_setopt函数进行POST请求的示例代码如下: ```php $url = 'http://example.com/api'; // POST请求的URL $data = ['name' => 'John', 'email' => '[email protected]']; // POST请求的数据 $curl = curl_init($url); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($curl); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); // 处理响应数据 ``` 在上面的示例中,通过curl_init函数初始化cURL会话,并设置请求的URL。然后使用curl_setopt函数设置POST请求,传递请求的数据和其他选项。使用curl_exec函数执行请求,并使用curl_getinfo函数获取响应的HTTP状态码。最后使用curl_close函数关闭cURL会话。 以上就是使用PHP Laravel和curl_setopt函数进行POST请求的示例代码。根据具体情况,可以选用Guzzle库或curl_setopt函数来发送POST请求,并根据响应进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值