每个边界的php curl multipart / data-form内容类型

时间:2015-05-14 23:00:24

标签: php json xml curl multipartform-data

我想我想知道在同一篇文章中是否有可能包含json,files,txt,xml的POST多部分/数据格式内容类型。 所以请求看起来像这样:

Content-Type: multipart/form-data; boundary=BOUNDARY
--BOUNDARY
Content-type:application/json
Content-Disposition:form-data

{{"SomeJsonObject":"valueOfObject"}}
--BOUNDARY
Content-type:application/xml
Content-Disposition:form-data

<node>SomeXML Nodes</node>
--BOUNDARY--


我知道我可以将其编码为字符串,手动包含边界,但我想知道是否可以通过

curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

谢谢

2 个答案:

答案 0 :(得分:1)

除了建立边界之外,没有办法在POST中发布STRING数据,但curl可以从磁盘发布文件,所以

file_put_contents('/tmp/fileForSend.json');
curl_setopt($curl, CURLOPT_POSTFIELDS, array(
  'file' =? '@/tmp/fileForSend.json;type=application/json', // this is CURL integrared feature, curl will read file itself
));

所以把'@'sybmol意味着CURL它必须读取文件并将其内容放入POST请求

答案 1 :(得分:1)

您也可以使用此hack将Content-Type传递给每个多部分边界:

$url = 'https://...'
$data = ["json\";\nContent-type:\"application/json\";\nContent-disposition:\"form-data" => '{"my":json}',
         "xml\";\nContent-type:\"application/xml\";\nContent-disposition:\"form-data" => "<root/>"];

$resource = curl_init();
curl_setopt($resource, CURLOPT_URL, $url);
curl_setopt($resource, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($resource, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($resource);
curl_close($resource);

我们的想法是将所有必要的标题“注入”“名称”选项,就像在SQL注入中一样。

上面的代码将发送包含所有必要标题的多部分请求:

------------------------------b66e31048210
Content-Disposition: form-data; name="json";
Content-type:"application/json";
Content-disposition:"form-data"

{"my":json}
------------------------------b66e31048210
Content-Disposition: form-data; name="xml";
Content-type:"application/xml";
Content-disposition:"form-data"

<root/>

但要小心,这些东西记录非常糟糕。