php curl multipart / data-form content-type для каждой границы

1

Думаю, мне хотелось бы знать, возможно ли в этом же сообщении тип контента POST multipart/data-form, содержащий json, files, txt, xml. поэтому запрос будет выглядеть так:

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);

спасибо

Теги:
curl
multipartform-data

2 ответа

1
Лучший ответ

нет возможности публиковать данные STRING в POST, кроме границ здания, но 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

  • 0
    Я возьму этот ответ, спасибо. Хотя мне не нужно публиковать файлы, это другая история. только данные из нескольких частей, включая пользовательские заголовки, затем json, xml, а затем просто строку. Я думаю, что библиотека будет обширной в этой области, но что бы там ни было ... я в конечном итоге сам строил границы.
1

Вы также можете передать 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/>

Но будьте осторожны, этот материал очень плохо документирован.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню