-
-
Save matt-allan/e6505f54fe6fd6117030 to your computer and use it in GitHub Desktop.
<?php | |
$stream = new GuzzleHttp\Psr7\MultipartStream([['name' => 'some-file', 'contents' => 'the contents']]); | |
$client = new GuzzleHttp\Client(); | |
$r = $client->request('POST', 'http://httpbin.org/post', ['body' => $stream]); | |
$r->getBody()->getContents(); | |
=> """ | |
{\n | |
"args": {}, \n | |
"data": "", \n | |
"files": {}, \n | |
"form": {\n | |
"some-file": "the contents"\n | |
}, \n | |
"headers": {\n | |
"Content-Length": "122", \n | |
"Content-Type": "multipart/form-data; boundary=568daeba8d610", \n | |
"Host": "httpbin.org", \n | |
"User-Agent": "GuzzleHttp/6.1.1 curl/7.37.1 PHP/5.6.13"\n | |
}, \n | |
"json": null, \n | |
"origin": "72.18.228.42", \n | |
"url": "http://httpbin.org/post"\n | |
}\n | |
""" | |
>>> |
As well as name
and contents
, there are other optional elements, such as filename
and headers
. The headers can be used to set Content-Type
for a file, for example.
Not forgetting also that instantiating MultipartStream
involves passing in multiple fields/parts, which can be a mix of text and streams.
Thanks Matthew, this is great stuff.
What I don't understand, is how your Content-Type is being set by Guzzle. I am finding Guzzle, using PSR-7 messages does not detect the content type automatically, and does not set the Content-Type header. I am having to explicitly set the Content-Type
header, which means also defining my own multipart boundary for this (Guzzle can give you the boundary it defines, but that is less portable). Are you using a stable Guzzle, or bleeding-edge dev?
for 'contents' you can just pass in a stream resource instead of a string.