用 Guzzle 重写 curl(文件上传)- PHP
Rewrite curl with Guzzle (File Upload) - PHP
我正在尝试将文件上传到我的服务器,然后将该文件发送到 Zendesk。 Zendesk 文档展示了如何:
curl "https://{subdomain}.zendesk.com/api/v2/uploads.json?filename=myfile.dat&token={optional_token}" \
-v -u {email_address}:{password} \
-H "Content-Type: application/binary" \
--data-binary @file.dat -X POST
这很好用。我现在必须用 Guzzle(版本 6)重写它。
我正在使用 Symfony 2.7:
$file = $request->files->get('file');
$urlAttachments = $this->params['base_url']."/api/v2/uploads.json?filename=".$file->getClientOriginalName();
$body = [
'auth' => [$this->params['user'], $this->params['pass']],
'multipart' => [
[
'name' => $archivo->getClientOriginalName(),
'contents' => fopen($file->getRealPath(), "r"),
],
]
];
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', $urlAttachments, $body);
$response = json_decode($response->getBody(), true);
文件正在上传,但当我下载它时,它还在其内容中获取了一些元数据(破坏了一些其他文件类型)。我想我没有正确上传它,因为使用 curls 的另一种方式工作正常。
--5b8003c370f19
Content-Disposition: form-data; name="test.txt"; filename="php6wiix1"
Content-Length: 1040
... The rest of the original content of the test file...
--5b8003c370f19--
我不知道为什么这个数据也作为文件的一部分发送(我不想这样做),或者是否可以为此使用 multipart。
感谢您的帮助!
可以使用multipart
没问题,但服务器必须正确处理。用不用都是不同的request-body
它经常用于 HTML 具有(多个)文件上传的表单。文件被命名(因此元信息),所以可以有多个文件。文件中也可能有正常的表单字段(文本)。你可能会找到更好的解释by searching,只是想做一个简单的解释。
在您的情况下,服务器处理多部分表单数据的方式与 "binary post" 不同,因此它会保存所有数据,包括元信息。
使用 body
传递原始正文并生成与 Guzzle 的 curl
相同的请求:
$urlAttachments = $this->params['base_url']."/api/v2/uploads.json?filename=".$file->getClientOriginalName();
$opts = [
// auth
'body' => fopen($file->getRealPath(), "r"),
'headers' => ['Content-Type' => 'application/binary'],
];
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', $urlAttachments, $opts);
我正在尝试将文件上传到我的服务器,然后将该文件发送到 Zendesk。 Zendesk 文档展示了如何:
curl "https://{subdomain}.zendesk.com/api/v2/uploads.json?filename=myfile.dat&token={optional_token}" \
-v -u {email_address}:{password} \
-H "Content-Type: application/binary" \
--data-binary @file.dat -X POST
这很好用。我现在必须用 Guzzle(版本 6)重写它。 我正在使用 Symfony 2.7:
$file = $request->files->get('file');
$urlAttachments = $this->params['base_url']."/api/v2/uploads.json?filename=".$file->getClientOriginalName();
$body = [
'auth' => [$this->params['user'], $this->params['pass']],
'multipart' => [
[
'name' => $archivo->getClientOriginalName(),
'contents' => fopen($file->getRealPath(), "r"),
],
]
];
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', $urlAttachments, $body);
$response = json_decode($response->getBody(), true);
文件正在上传,但当我下载它时,它还在其内容中获取了一些元数据(破坏了一些其他文件类型)。我想我没有正确上传它,因为使用 curls 的另一种方式工作正常。
--5b8003c370f19
Content-Disposition: form-data; name="test.txt"; filename="php6wiix1"
Content-Length: 1040
... The rest of the original content of the test file...
--5b8003c370f19--
我不知道为什么这个数据也作为文件的一部分发送(我不想这样做),或者是否可以为此使用 multipart。
感谢您的帮助!
可以使用multipart
没问题,但服务器必须正确处理。用不用都是不同的request-body
它经常用于 HTML 具有(多个)文件上传的表单。文件被命名(因此元信息),所以可以有多个文件。文件中也可能有正常的表单字段(文本)。你可能会找到更好的解释by searching,只是想做一个简单的解释。
在您的情况下,服务器处理多部分表单数据的方式与 "binary post" 不同,因此它会保存所有数据,包括元信息。
使用 body
传递原始正文并生成与 Guzzle 的 curl
相同的请求:
$urlAttachments = $this->params['base_url']."/api/v2/uploads.json?filename=".$file->getClientOriginalName();
$opts = [
// auth
'body' => fopen($file->getRealPath(), "r"),
'headers' => ['Content-Type' => 'application/binary'],
];
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', $urlAttachments, $opts);