То, что вы хотите сделать, - это на самом деле именно то, как многокомпонентные сообщения работают с массивом $_POST
.
Рассмотрим следующую HTML-форму:
<form action="/somefile.php" method="post" enctype="multipart/form-data">
<input name="text1" type="text" />
<input name="text2" type="text" />
<input name="text3" type="text" />
<input name="file" type="file" />
<input type="submit" />
</form>
Теперь предположим, что мы заполняем три текстовых ввода value1
, value2
и value3
, выбираем файл с именем file.txt
и нажимаем submit. Это приведет к тому, что запрос будет выглядеть примерно так:
POST /somefile.php HTTP/1.1
Host: somehost.com
Accept: */*
User-Agent: MyBrowser/1.0
Content-Type: multipart/form-data; boundary="this-is-a-boundary-string"
--this-is-a-boundary-string
Content-Dispostion: form-data; name="text1"
value1
--this-is-a-boundary-string
Content-Dispostion: form-data; name="text2"
value2
--this-is-a-boundary-string
Content-Dispostion: form-data; name="text3"
value3
--this-is-a-boundary-string
Content-Dispostion: form-data; name="file"; filename="file.txt"
Content-Type: text/plain
This is the contents of file.txt
--this-is-a-boundary-string--
Когда мы смотрим на это в PHP, если мы print_r($_POST);
, мы должны получить что-то вроде этого:
Array
(
[text1] => value1
[text2] => value2
[text3] => value3
)
... а если мы print_r($_FILES);
:
Array
(
[file] => Array
(
[name] => file.txt
[type] => text/plain
[size] => 32
[tmp_name] => /tmp/dskhfwe43232.tmp
[error] => 0
)
)
... так что вы можете видеть, что части сообщения, где заголовок Content-Disposition:
не содержит элемент filename=""
, добавляются в массив $_POST
, а те, у которых есть один, рассматриваются как загрузка и добавление файлов до $_FILES
.
При создании сообщения multipart/form-data
для отправки на сервер я считаю, что проще всего создать HTML-форму, которую вы имитируете с запросом, и создать свое HTTP-сообщение на основе поведения этой HTML-формы.