尝试使用Laravel HTTP向第三方上传文件

kuuvgm7e  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(264)

我有以下 Postman 要求测试第三方API;

我尝试做的是使用Laravel的HTTP类将其转换为代码,我目前拥有的代码是;

public function uploadToThridParty()
{
    $uploadContents = [
        'id' => 'this-is-my-id',
        'fileUpload' => true,
        'frontfile' => Storage::get('somefrontfile.jpg'),
        'sideview' => Storage::get('itsasideview.png'),
    ];

    $request = Http::withHeaders(
        [
            'Accept' => 'application/json',
        ]
    );

    $response = $request
        ->asForm()
        ->post(
            'https://urltoupload.com/upload', $uploadContents
        )
}

但是每次我运行这个程序时,第三方API都会返回Invalid ID,即使我使用相同ID的Postman,它也能正常工作。
我似乎找不出我的代码哪里出错了;

hmae6n7t

hmae6n7t1#

正如@Cbroe提到的在发送发布请求之前附加文件,您可以像下面的示例一样:

public function uploadToThridParty()
{
    $uploadContents = [
        'id' => 'this-is-my-id',
        'fileUpload' => true
    ];

    $request = Http::withHeaders(
        [
            'Accept' => 'application/json',
        ]
    );

    $response = $request
        ->attach(
        'frontfile', file_get_contents(storage_path('somefrontfile.jpg')), 'somefrontfile.jpg' 
         )
        ->attach(
        'sideview', file_get_contents(storage_path('itsasideview.png')), 'itsasideview.jpg' 
         )
        ->post(
            'https://urltoupload.com/upload', $uploadContents
        )
}

我还认为您需要删除asForm方法,因为它将您的头接受类型重写为application/x-www-form-urlencoded,这是您的异常是无效ID的方式

9rbhqvlz

9rbhqvlz2#

某些第三方API会要求您将请求的内容类型设置为multipart/form data
您可以仔细检查所有的标题正在传递您的 Postman 请求标题选项卡和查看隐藏的标题。
如果您确实需要您的请求是在multipart/form-data中,您可以使用guzzle的multipart选项。
尽管这似乎不在Laravel HTTP-Client docs上,但您可以在HTTP请求中简单地传递asMultipart()方法
只需检查/vendor/laravel/framework/src/Illuminate/Support/Facades/Http.php以获取HTTP客户端的完整引用。
你可以这样提出你的要求。

public function uploadToThridParty() {
    $uploadContents = [            
        [
            'name' => 'id',
            'contents' => 'this-is-my-id'
        ],
        [
            'name' => 'fileUpload',
            'contents' => true
        ],
        [ 
            'name' => 'frontfile', 
            'contents' => fopen( Storage::path( 'somefrontfile.jpg' ), 'r') 
        ], 
        [ 
            'name' => 'sideview', 
            'contents' => fopen( Storage::path( 'itsasideview.jpg' ), 'r') 
        ], 
    ];

    $request = Http::withHeaders(['Accept' => 'application/json']);

    $response = $request->asMultipart()->post('https://urltoupload.com/upload', $uploadContents );
}

相关问题