laravel 使用Guzzle上传文件

7uhlpewt  于 2023-05-08  发布在  其他
关注(0)|答案(3)|浏览(144)

我有一个表格,视频可以上传并发送到远程目的地。我有一个cURL请求,我想'翻译'到PHP使用Guzzle。
到目前为止,我有这个:

public function upload(Request $request)
    {
        $file     = $request->file('file');
        $fileName = $file->getClientOriginalName();
        $realPath = $file->getRealPath();

        $client   = new Client();
        $response = $client->request('POST', 'http://mydomain.de:8080/spots', [
            'multipart' => [
                [
                    'name'     => 'spotid',
                    'country'  => 'DE',
                    'contents' => file_get_contents($realPath),
                ],
                [
                    'type' => 'video/mp4',
                ],
            ],
        ]);

        dd($response);

    }

这是我使用的cURL,并希望将其翻译为PHP:

curl -X POST -F 'body={"name":"Test","country":"Deutschland"};type=application/json' -F 'file=@C:\Users\PROD\Downloads\617103.mp4;type= video/mp4 ' http://mydomain.de:8080/spots

所以当我上传视频的时候,我想把这个硬编码的

C:\Users\PROD\Downloads\617103.mp4

当我运行它时,我得到一个错误:
客户端错误:POST http://mydomain.de:8080/spots导致400 Bad Request响应:请求正文无效:需要表单值'body' 客户端错误:POST http://mydomain.de/spots导致400 Bad Request`响应:请求正文无效:需要表单值'body'

93ze6v8z

93ze6v8z1#

我会查看Guzzle的multipart请求选项。我看到两个问题:

  1. JSON数据需要被字符串化,并使用与curl请求中使用的名称相同的名称传递(名称为body,令人困惑)。
  2. curl请求中的typeMap到header Content-Type。从$ man curl
    你也可以通过使用'type ='来告诉curl使用什么Content-Type。
    尝试以下操作:
$response = $client->request('POST', 'http://mydomain.de:8080/spots', [
    'multipart' => [
        [
            'name'     => 'body',
            'contents' => json_encode(['name' => 'Test', 'country' => 'Deutschland']),
            'headers'  => ['Content-Type' => 'application/json']
        ],
        [
            'name'     => 'file',
            'contents' => fopen('617103.mp4', 'r'),
            'headers'  => ['Content-Type' => 'video/mp4']
        ],
    ],
]);
thtygnil

thtygnil2#

  • 在使用multipart选项时,请确保没有传递content-type => application/json:)
  • 如果你想POST表单字段和上传文件在一起,只需使用这个multipart选项。它是一个数组的数组,其中name是表单字段名称,它的值是POST的表单值。举个例子:
'multipart' => [
                [
                    'name' => 'attachments[]', // could also be `file` array
                    'contents' => $attachment->getContent(),
                    'filename' => 'dummy.png',
                ],
                [
                    'name' => 'username',
                    'contents' => $username
                ]
            ]
lf3rwulv

lf3rwulv3#

如果php在目标服务器上,则需要filename

相关问题