以下代码片段适用于GuzzleHttp v5。
$response = $client->post(
$uri,
[
'headers' => ['Cookie' => 'JSESSIONID=' . $sessionId],
'body' => ['Filedata' => fopen($filename, 'r')],
]
);
$ filename中指定的文件内容作为变量'Filedata'发送到URI。
上传规范是:
http://yourserver.com/services/create?Filedata=<multipart/form-data encoded file>...
文件必须以'Filedata'的形式发送。如何为GuzzleHttp v6编码?
据我所知,GuzzleHttp v6不允许这样做,但我只是尝试了一两天而且没有时间自己研究它,因为应用程序必须在周一交付。< / p>
有什么想法吗?
我现在将它留作v5,但这只是回避问题。
答案 0 :(得分:1)
一旦找到答案,当然是显而易见的。以下代码是解决方案:
$response = $client->post(
$uri,
[
'multipart' => [
[
'name' => 'Filedata',
'contents' => open($filename, 'r'),
]
],
'headers' => ['Cookie' => 'JSESSIONID=' . $sessionId],
]
);
感谢Shaun Bramley指出我正确的方向。
答案 1 :(得分:0)
我最初的问题是为您的特定用例提供额外的背景信息。
对于您的特定用例,主要问题是'body'请求选项不再接受数组。参考:如果client::invalidBody()
为真,则Client::requestAsync会致电is_array()
。
最简单的方法是:
$response = $client->post(
$uri,
[
'headers' => ['Cookie' => 'JSESSIONID=' . $sessionId],
'form_params' => ['Filedata' => fopen($filename, 'r')],
]
);
默认情况下Guzzle 5.3处理的身体参数作为PostBody作为数组传递。这意味着数组索引和值最终使用http_build_query
urlencoded为字符串。
根据您的特定用例(客户端维护其会话的时间长度),您可能还需要考虑使用CookieJar。链接:Using Cookies和CookieJar供参考。