Составное сообщение и параметры POST на стороне сервера - PullRequest
0 голосов
/ 23 декабря 2011

Я пытаюсь отправить файл в составное сообщение. Проблема в том, что мне нужно передать два дополнительных параметра с этим файлом. И я хочу, чтобы они были доступны в массиве параметров POST. Вопрос в том, можно ли добавить часть в составное сообщение, чтобы оно интерпретировалось как параметр POST? Или я трачу время?

Я хочу это, например:

--1BEF0A57BE110FD467A\r\n
Content-Disposition: form-data; name="name1"\r\n
\r\n
value\r\n

быть доступным для $_POST['name1']

PS: Насколько я знаю, если кто-то загрузит файл с actionScript FileReference.upload(urlRequest) и укажет параметры записи в urlRequest, тогда они будут в $_POST

1 Ответ

3 голосов
/ 23 декабря 2011

То, что вы хотите сделать, - это на самом деле именно то, как многокомпонентные сообщения работают с массивом $_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-формы.

...