如何使用Laravel将接收的文件发送到外部API

问题描述

我有一个接收文件的laravel api,我必须保存并将该文件发送到另一个(外部)api。

我可以将文件保存到存储中,但是不能将文件发送到外部api。

我的上传方法是:

public function upload(Request $request) {
        if ($request->hasFile('image')
            && $request->file('image')->isValid()) {
            $name = $request->userid;
            $extension = $request->image->extension();
            $nameFile = "prefix_{$name}.{$extension}";
            $file = $request->image;
            $file->storeAs('users',$nameFile);

            $this->sendFile('./storage/users/' . $nameFile,$request->sellerid,'type');

            $url = 'http://'.$_SERVER['HTTP_HOST'] . '/storage/users/' . $nameFile;
            return $url;
        }
    }

这可行,但是 sendDocument 函数不起作用:

private function sendFile($file,$sellerid,$type) 
    {
        $auth = 'XXXX';
        
        $curl = curl_init();

        curl_setopt_array($curl,array(
        CURLOPT_URL => "https://api.url.com/",CURLOPT_RETURNTRANSFER => true,CURLOPT_ENCODING => "",CURLOPT_MAXREDirs => 10,CURLOPT_TIMEOUT => 30,CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,CURLOPT_CUSTomrEQUEST => "POST",CURLOPT_POSTFIELDS => "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-disposition: form-data; name=\"file\"; filename=\"{$file}\"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-disposition: form-data; name=\"type\"\r\n\r\n{$type}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--",CURLOPT_HTTPHEADER => array(
            "authorization: Basic {$auth}","cache-control: no-cache","content-type: multipart/form-data;",),));

        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);

        if ($err) {
            throw "cURL Error #:" . $err;
        } else {
            echo $response;
        }
    }

我如何将文件发送到外部api?

解决方法

我用Guzzle解决了这个问题:

private function sendFile($file,$sellerid,$type) 
    {
        $url = "api";

        $auth = 'XXXX';

        $client = new Client();
        
        $response = $client->request('POST',$url,[
            'multipart' => [
                [
                    'name'     => 'category','contents' => $type
                ],[
                    'name'     => 'file','contents' => fopen($file,'r'),'headers'  => ['Content-Type' => 'image/jpeg']
                ],],'headers' => [
                'Authorization' => "Basic {$auth}"
            ],]);
        return $response->getBody();
    }
,

要使其仅与CURL一起使用,请先使用CURLFile并将结果与​​您的post参数一起传递:

<?php
    
    // Create a cURL handle
    $ch = curl_init('http://example.com/upload.php');
    
    // Create a CURLFile object
    $cfile = new CURLFile('cats.jpg','image/jpeg','test_name');
    
    // Assign POST data
    $data = array('test_file' => $cfile);
    curl_setopt($ch,CURLOPT_POST,1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
    
    // Execute the handle
    curl_exec($ch);

来源:https://www.php.net/manual/en/curlfile.construct.php