PHP в деталях



         

Content-Type: multipart/form-data. - часть 2


Хочу обратить Ваше внимание та то, что в заголовках разделов не надо использовать Content-Length, а вот в заголовке запроса надо и его значение является размером всего Entity-Body, стоящего после второго \r\n, следующего за Content-Length: 209\r\n. Т.е. Entity-Body отделяется от заголовка дополнительным переводом строки (что можно заметить и в разделах).

А теперь давайте напишем запрос для передачи файла.

POST http://www.site.ru/postnews.html HTTP/1.0\r\n

Host: www.site.ru\r\n

Referer: http://www.site.ru/news.html\r\n

Cookie: income=1\r\n

Content-Type: multipart/form-data; boundary=1BEF0A57BE110FD467A\r\n

Content-Length: 491\r\n

\r\n

--1BEF0A57BE110FD467A\r\n

Content-Disposition: form-data; name="news_header"\r\n

\r\n

Пример новости\r\n

--1BEF0A57BE110FD467A\r\n

Content-Disposition: form-data; name="news_file"; filename="news.txt"\r\n

Content-Type: application/octet-stream\r\n

Content-Transfer-Encoding: binary\r\n

\r\n

А вот такая новость, которая лежит в файле news.txt\r\n

--1BEF0A57BE110FD467A--\r\n

В данном примере в первом разделе пересылается заголовок новости, а во втором разделе пересылается файл news.txt. Внимательный да увидит поля filename и Content-Type во втором разделе. Поле filename задает имя пересылаемого файла, а поле Content-Type ? тип данного файла. Application/octet-stream говорит о том, что это стандартный поток данных, а Content-Transfer-Encoding: binary говорит на о том, что это бинарные данные, ничем не закодированные.

Очень важный момент. Большинство CGI скриптов написано умными людьми, поэтому они любят проверять тип пришедшего файла, который стоит в Content-Type. Зачем? Чаще всего закачка файлов на сайтах используется для получения картинок от посетителя. Так вот, браузер сам пытается определить что за файл посетитель хочет отправить и вставляет соответствующий Content-Type в запрос. Скрипт его проверяет при получении, и, например, если это не gif или не jpeg игнорирует данный файл. Поэтому при "ручном" формировании запроса позаботьтесь о значении Content-Type, чтобы оно было наиболее близким к формату передаваемого файла.

image/gifдля gif
image/jpegдля jpeg
image/pngдля png
image/tiffдля tiff (что используется крайне редко, уж больно емкий формат)

В нашем примере формируется запрос, в котором передается текстовый файл. Точно так же формируется запрос для передачи бинарного файла.




Содержание  Назад  Вперед