file-upload - 使用 Guzzle 6 将文件上传到 ebay FEED_API 端点
问题描述
我正在尝试使用 Guzzle 6.5 使用 ebay FEED_API 上传 e 文件,以将 FILE-EXCHANGE 迁移到 REST API:
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.ebay.com']);
$client->request('POST', '/sell/feed/v1/task/task-40-XXXXXXXXXX/upload_file', [
'headers' => [
'Authorization' => 'Bearer ' . $this->getToken($ebayStore),
'Content-Type' => 'multipart/form-data'
],
'multipart' => [
[
'name' => 'fileName',
'contents' => basename(/path/to/file)
],
[
'name' => 'name',
'contents' => 'file'
],
[
'name' => 'type',
'contents' => 'form-data'
],
[
'name' => 'file',
'contents' => fopen(/path/to/file, 'r'),
'filename' => basename(/path/to/file)
]
]
]);
但我收到以下错误:
[errors] => Array
(
[0] => stdClass Object
(
[errorId] => 2003
[domain] => ACCESS
[category] => APPLICATION
[message] => Internal error
[longMessage] => There was a problem with an eBay internal system or process. Contact eBay developer support for assistance
[parameters] => Array
(
[0] => stdClass Object
(
[name] => code
[value] => 400
)
[1] => stdClass Object
(
[name] => message
[value] => HTTP 400 Bad Request
)
)
)
)
但是如果我尝试使用 curl 通过 cli 上传文件,它可以工作:
curl -g -k -X POST "https://api.ebay.com/sell/feed/v1/task/task-40-XXXXXXXXXX/upload_file" -H "Content-Type: multipart/form-data" -H "Authorization: Bearer v^1.1#i^1#r^0#f^0#p^3#I^3#t..." -i -F "file=@/path/to/file"
当我对请求使用 guzzle 时,似乎 api 端点无法识别与表单关联的文件。
我哪里错了?
- - 编辑 - -
即便如此它仍然有效:
$headers = [
'Authorization:Bearer ' . $this->getToken($ebayStore),
'Content-Type:multipart/form-data'
];
$formData = [
'fileName' => basename($file),
'name' => 'file',
'type' => 'form-data',
'file' => curl_file_create($file)
];
$connection = curl_init();
curl_setopt($connection, CURLOPT_URL, self::API_REQUEST_URI.$taskid.'/upload_file');
curl_setopt($connection, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($connection, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($connection, CURLOPT_MAXREDIRS , 10);
curl_setopt($connection, CURLOPT_HEADER, 1);
curl_setopt($connection, CURLINFO_HEADER_OUT, true);
curl_setopt($connection, CURLOPT_HTTPHEADER, $headers);
curl_setopt($connection, CURLOPT_POST, 1);
curl_setopt($connection, CURLOPT_POSTFIELDS, $formData);
curl_setopt($connection, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($connection);
curl_close($connection);
解决方案
我的错误是在标题中手动插入内容类型。
这是我的工作代码:我的错误是在标题中手动插入内容类型。
这是我的工作代码:
$client = new GuzzleHttp\Client(['base_uri' => 'https://api.ebay.com']);
$client->request('POST', '/sell/feed/v1/task/task-40-XXXXXXXXXX/upload_file', [
'headers' => [
'Authorization' => 'Bearer ' . $this->getToken($ebayStore)
],
'multipart' => [
[
'name' => 'file',
'contents' => fopen($file, 'r'),
'filename' => basename($file),
'headers' => [
'Content-Disposition' => 'form-data; name="file"; fileName="'.basename($file).'"; type="form-data"'
]
]
]
]);
推荐阅读
- javascript - 客户端上的 XSLT 转换以避免使用 JavaScript 的 CORS
- python - 在不创建对象的情况下为类变量分配内存
- javascript - 如何测试使用 chai 或 chai-as-promised 为异步函数抛出的错误?
- asp.net - 将 Startup.cs 代码从 Core 修改为旧版 ASP.NET
- typescript - 将给定的 Array 类型解构为新类型
- django - Django 生产服务器中的错误网关
- c++ - 模板元编程递归评估
- android - 如何使用 Parcelize 在 kotlin 中打包任何类型的列表?
- javascript - 避免将 DOM 更改合并在一起
- reactjs - 在 `render()` 、 `handleSubmit()` 、 `handleChange()` 之外访问具有当前状态的状态变量