Guzzle PSR7 请求 multipart/form-data

Guzzle PSR7 request with multipart/form-data

我在 Lumen(应用程序 A)中创建了一个简单的 API,其中:

public function apiMethod(ServerRequestInterface $psrRequest)
{
    $url = $this->getUri();

    $psrRequest = $psrRequest->withUri($url);

    $response = $this->httpClient->send($psrRequest);

    return response($response->getBody(), $response->getStatusCode(), $response->getHeaders());
}

以上代码将数据传递给查询参数、x-www-form-urlencoded 或 JSON 内容类型的应用程序 B。但是,它未能通过 multipart/form-data。 (该文件在应用程序 A 中可用:$psrRequest->getUploadedFiles())。

编辑 1

我尝试用 Buzz

替换 Guzzle 调用
    $psr18Client = new Browser(new Curl(new Psr17Factory()), new Psr17Factory());
    $response = $psr18Client->sendRequest($psrRequest);

但是,这并没有什么不同。

编辑 2

ServerRequestInterface 的实例表示服务器端的请求。 Guzzle 和 Buzz 使用 RequestInterface 的一个实例来发送数据。 RequestInterface 缺少对上传文件的抽象。所以应该手动添加文件http://docs.guzzlephp.org/en/stable/request-options.html#multipart

    $options = [];
    /** @var UploadedFileInterface $uploadedFile */
    foreach ($psrRequest->getUploadedFiles() as $uploadedFile) {
        $options['multipart'][] = [
            'name' => 'file',
            'fileName' => $uploadedFile->getClientFilename(),
            'contents' => $uploadedFile->getStream()->getContents()
        ];
    }

    $response = $this->httpClient->send($psrRequest, $options);

但仍然没有运气。

我错过了什么?如何更改请求以便正确发送文件?

似乎在使用 guzzle 中的 post 方法时考虑了 $options['multipart']。因此,将代码更改为 $response = $this->httpClient->post($psrRequest->getUri(), $options); 即可解决问题。 此外,重要的是不要附加 'content-type header.