gpt4 book ai didi

php - 使用 Guzzle 6 将文件上传到 API 端点

转载 作者:IT王子 更新时间:2023-10-28 23:49:57 25 4
gpt4 key购买 nike

我可以使用 Postman 将文件上传到 API 端点。

我正在尝试将其转换为从表单上传文件,使用 Laravel 上传文件并使用 Guzzle 6 发布到端点。

它在 Postman 中的截图(我故意省略了 POST URL) enter image description here

下面是当您在 POSTMAN 中单击“生成代码”链接时它生成的文本:

POST /api/file-submissions HTTP/1.1
Host: strippedhostname.com
Authorization: Basic 340r9iu34ontoeioir
Cache-Control: no-cache
Postman-Token: 6e0c3123-c07c-ce54-8ba1-0a1a402b53f1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="FileContents"; filename=""
Content-Type:


----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="FileInfo"

{ "name": "_aaaa.txt", "clientNumber": "102425", "type": "Writeoff" }
----WebKitFormBoundary7MA4YWxkTrZu0gW

下面是用于保存文件和其他信息的 Controller 函数。文件上传正确,我可以获取文件信息。

我认为我遇到的问题是使用正确的数据设置多部分和标题数组。

public function fileUploadPost(Request $request)
{
$data_posted = $request->input();
$endpoint = "/file-submissions";
$response = array();
$file = $request->file('filename');
$name = time() . '_' . $file->getClientOriginalName();
$path = base_path() .'/public_html/documents/';

$resource = fopen($file,"r") or die("File upload Problems");

$file->move($path, $name);

// { "name": "test_upload.txt", "clientNumber": "102425", "type": "Writeoff" }
$fileinfo = array(
'name' => $name,
'clientNumber' => "102425",
'type' => 'Writeoff',
);

$client = new \GuzzleHttp\Client();

$res = $client->request('POST', $this->base_api . $endpoint, [
'auth' => [env('API_USERNAME'), env('API_PASSWORD')],
'multipart' => [
[
'name' => $name,
'FileContents' => fopen($path . $name, 'r'),
'contents' => fopen($path . $name, 'r'),
'FileInfo' => json_encode($fileinfo),
'headers' => [
'Content-Type' => 'text/plain',
'Content-Disposition' => 'form-data; name="FileContents"; filename="'. $name .'"',
],
// 'contents' => $resource,
]
],
]);

if($res->getStatusCode() != 200) exit("Something happened, could not retrieve data");

$response = json_decode($res->getBody());

var_dump($response);
exit();
}

我收到的错误,它是如何使用 Laravel 的调试 View 显示的屏幕截图:

enter image description here

最佳答案

您发布数据的方式有误,因此收到的数据格式不正确。

Guzzle docs :

The value of multipart is an array of associative arrays, each containing the following key value pairs:

name: (string, required) the form field name

contents:(StreamInterface/resource/string, required) The data to use in the form element.

headers: (array) Optional associative array of custom headers to use with the form element.

filename: (string) Optional string to send as the filename in the part.

使用上述列表之外的键并设置不必要的 header 而不将每个字段分隔到一个数组中将导致发出错误的请求。

$res = $client->request('POST', $this->base_api . $endpoint, [
'auth' => [ env('API_USERNAME'), env('API_PASSWORD') ],
'multipart' => [
[
'name' => 'FileContents',
'contents' => file_get_contents($path . $name),
'filename' => $name
],
[
'name' => 'FileInfo',
'contents' => json_encode($fileinfo)
]
],
]);

关于php - 使用 Guzzle 6 将文件上传到 API 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38133244/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com