Как разобрать поток HTTP POST (загрузка файла)? - PullRequest
2 голосов
/ 25 сентября 2010

Я использую обработчик действий для загрузки файла, механизм выберет файл и отправит файл по сети через команду HTTP POST, в документе говорится, что сообщение POST имеет вид

POST /handler.cfm HTTP/1.1
  Accept: text/*
  Content-Type: multipart/form-data; 
  boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
  User-Agent: Shockwave Flash 
  Host: www.example.com 
  Content-Length: 421 
  Connection: Keep-Alive 
  Cache-Control: no-cache

  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
  Content-Disposition: form-data; name="Filename"

  MyFile.jpg
  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
  Content-Disposition: form-data; name="photo"; filename="MyFile.jpg"
  Content-Type: application/octet-stream

  FileDataHere
  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7
  Content-Disposition: form-data; name="Upload"

  Submit Query

  ------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--

На стороне сервера у меня есть программа на C ++, которая прослушивает порт 80 и анализирует сообщение POST. Я хочу только имя файла и данные файла. Как декодировать данные файла с помощью c ++, кодируется ли он base64 и может ли библиотека сделать это для меня? Я хочу декодировать двоичный файл и записать его в файл, спасибо!

Ответы [ 2 ]

5 голосов
/ 25 сентября 2010

Нет, кодировка отсутствует.Тело каждой части составного сообщения включается как дословные байты.Следовательно, вы должны быть осторожны, чтобы выбрать boundary строку, которая нигде не встречается в данных файла.

Чтобы проанализировать отправку формы multipart / form-data, вам будет достаточно анализатора MIME для анализаЗаголовки, выберите нужные параметры, такие как boundary и name, и разбейте полученное сообщение по граничной строке.Это не совсем тривиально, поэтому вы можете рассмотреть существующие библиотеки .

(К сожалению, то, что на самом деле делают браузеры в HTTP, немного отличается от стандартных правил MIME, изложенных в RFC1341 . В частности, параметры имени поля и имени файла, как правило, включают не-ASCII-символы и неэкранированные кавычки. Но, если вы сами генерируете POST, надеюсь, вы сможете избежать этих спорных вопросов.)

1 голос
/ 25 сентября 2010

В отсутствие заголовка «Content_Transfer_Encoding» предполагается, что данные закодированы в «7 бит» ( RFC 1521 ; RFC 1867 ; RFC 2616 ).

Я не знаю, есть ли библиотека C для анализа / декодирования HTTP POST.Я уверен, что есть, хотя:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...