【问题标题】:Upload multiple files from Client to Server via API using HTTP guzzle in laravel 8在 laravel 8 中使用 HTTP guzzle 通过 API 将多个文件从客户端上传到服务器
【发布时间】:2020-12-15 11:07:12
【问题描述】:

我经过邮递员测试,附加了带有字段 fileupload[0](见下面的截图)的文件,该文件工作正常,添加了请求,fileupload 也上传到了服务器。

但我想通过我的 laravel HTTP 客户端调用那个上传文件 api

我试过下面的代码

$result = Http::attach(
            'attachment', $request->fileupload
        )->asForm()->post('http://192.168.1.100/api/request/store', $form_param);

我在表单上传中的控制:

 <input type="file" name="fileupload[]" multiple>

但 API 服务器似乎没有从客户端获取我的请求文件。

那么如何使用 laravel HTTP 通过客户端上传文件(或多个文件)?

【问题讨论】:

  • 如果只有一个文件,这个$request-&gt;fileupload 应该是$request-&gt;file('fileupload') 但我猜你要上传多个文件
  • @bhucho 是的,我上传了多个文件,你有解决方案吗

标签: php laravel guzzle


【解决方案1】:

您需要更改的地方很少。

这是guzzle文档中写的一行。由于 Http Client 是 guzzle 的包装类,它也适用于它。

multipart 不能与 form_params 选项一起使用。您将需要使用其中一种。对 application/x-www-form-urlencoded 请求使用 form_params,对 multipart/form-data 请求使用 multipart。

正如您在上面的邮递员屏幕截图中所示,您的数据内容类型是form-data 而不是application/x-www-form-urlencoded

所以你不能使用asForm()。它在内部将内容类型设置为application/x-www-form-urlencoded

attach() 函数在内部添加了asMultipart(),因此您无需添加它。

其次,为了传递多个附件,您需要将数组作为第一个参数传递给 attach() 函数。为此

    if($request->hasFile('fileupload')) {
        $names = [];
        foreach ($request->file('fileupload') as $file) {
            if(file_exists($file)){
                $name= $file->getClientOriginalName();
                $names[] = $name;
            }
        }
    }

现在将这个数组 $names 传递给 attach 方法,

$result = Http::attach(
            $names, $request->file('fileupload')
        )->post('http://192.168.1.100/api/request/store', $form_param);

如果您在内部将数组作为第一个参数传递,则此函数是递归的,并会调用自身来上传所有文件。


虽然这不是问题的一部分,但我建议以下面给定的格式调用 http 请求。

   try{
   $result = Http::attach(
            $names, $request->file('fileupload')
        )->post('http://192.168.1.100/api/request/store', $form_param);
   $result->throw(); 
} catch(\Illuminate\Http\Client\RequestException $e){
   \Log::info($e->getMessage());
   // handle your exception accordingly
}

因为它永远不能保证响应总是好的。

【讨论】:

  • 所以我按照你的回答,但我收到错误:附加后 $names 上的“只有数组和 Traversables 可以解包”。使用 dd($names) 我检查了 $names 是否真的是一个数组,以及它是否包含正确的数据,它是正确的,并且它确实包含一个文件名数组。你知道这里可能出了什么问题吗?
  • 可能在某些情况下,如果您使用某个循环,它可能会发送 null 以表示未找到文件,您可以检查 is_array()
  • 我在 $result 周围添加了一个 IF 语句,但它仍然通过,所以它必须是一个数组。我还在 StackOverflow 上创建了一个带有完整代码和堆栈跟踪的问题,如果你能看一下 stackoverflow.com/questions/70897044/…,我将不胜感激
猜你喜欢
  • 2021-01-06
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多