【问题标题】:how to send multiple files with one key in laravel using guzzle Http如何使用 guzzle Http 在 laravel 中一键发送多个文件
【发布时间】:2020-12-29 15:52:51
【问题描述】:

我可以像下面这样使用邮递员发送多个文件和字符串数据:

但问题是如何使用 laravel http 发送类似的请求?

我所做的是:


public function performMultiPartRequest($requestUrl, $body)
    {
        $response = Http::withHeaders(['Accept' => 'application/json']);
        $data = [];
        foreach ($body as $key => $value) {
            if (gettype($value) == 'string') // for string data. works well.
                array_push($data,[$key, $value]);
            else if (gettype($value) == 'array') { // array of files. doesn't work!
                foreach ($value as $file) {
                    $extension = $file->getClientOriginalExtension();
                    $response->attach($key , fopen($file, 'r'), mt_rand(100,1000).".".$extension);
                }
            }
            else { // one file. works well.
                $extension = $value->getClientOriginalExtension();
                $response->attach($key, fopen($value, 'r'), 'temp.'.$extension);
            }
        }
        $response = $response->post($this->baseUri.$requestUrl, $body);
        return $response;

    }

当我尝试使用一个或多个具有不同键的文件发送一些字符串键值时,没关系,但是当我尝试使用多个文件上传(一个键)发送数据时会发生错误。

错误信息是: A 'contents' key is required,状态码为 0

【问题讨论】:

标签: laravel guzzle laravel-7


【解决方案1】:

很遗憾,我还没有找到使用Illuminate\Support\Facades\Http 完成工作的解决方案,但由于项目时间限制,我改用了GuzzleHttp\Client


            $client = new Client([
                "base_uri" => $url,
            ]);
            $data = [];
            $data['multipart'] = [];
            foreach ($body as $key => $value) {
                if (gettype($value) == 'string') {
                    array_push($data['multipart'], [
                        'name' => $key,
                        'contents' => $value
                    ]);
                } else if (gettype($value) == 'array') {
                    foreach ($value as $k =>  $file) {
                        if (file_exists($file)) {
                            $extension = $file->getClientOriginalExtension();
                            array_push($data['multipart'], [
                                'name' => $key."[]",
                                'contents' => fopen($file, 'r'),
                                'filename' => mt_rand(100, 1000) . "." . $extension
                            ]);
                        }
                    }
                }
            }

            $response = $client->request('POST', $requestUrl, $data);

它适用于我的情况。 但任何解决 laravel Http 门面的方法都会因这个问题而受到赞赏。

【讨论】:

  • 直接使用guzzle也不错,即使Http内部也会调用guzzle的multipart函数,另外我建议你是否可以避免array_push & 直接使用$var[]语法来添加新值数组它会节省很多内存和时间(主要是内存(因为数组函数会消耗内存来操作)),你也可以捕获 RequestException
猜你喜欢
  • 1970-01-01
  • 2020-07-14
  • 2018-02-07
  • 2021-01-06
  • 2018-03-21
  • 2020-01-27
  • 2018-03-27
  • 2018-11-02
  • 2020-02-13
相关资源
最近更新 更多