как http-сервер получил файл от клиента - PullRequest
1 голос
/ 06 марта 2012

Я написал код для отправки пользовательских паролей клиента на HTTP-сервер для проверки через HTTP.Я генерирую строку запроса (содержащую usr, pwd) и отправляю запрос на сервер.Это работает.

Но теперь мне нужно отправить файл (text/xml) на этот сервер.Я не знаю, как это можно сделать.

Нужно ли писать код на сервере или только на клиенте?

Каковы механизмы на сервере для приема файлов и на клиенте для отправки файлов?

Ответы [ 3 ]

2 голосов
/ 07 марта 2012

Протокол HTTP действительно прост, на самом деле:

  1. клиент отправляет строку, содержащую имя метода HTTP, URL и версию протокола
  2. клиент отправляет заголовок RFC822, содержащий параметры запроса, и, если блок данных следует, подробности о блоке данных.
  3. клиент отправляет блок данных
  4. сервер отправляет строку, содержащую версию протокола, код состояния и сообщение
  5. сервер отправляет заголовок RFC822, содержащий параметры ответа, и, если блок данных следует (или клиент выполнил запрос HEAD), подробности о блоке данных
  6. сервер отправляет блок данных, если метод не HEAD.
  7. соединение оборвано или протокол перезапущен.

Обычно серверы понимают, по крайней мере, следующие методы:

  • GET (клиент не отправляет блок данных, сервер отправляет блок данных)
  • HEAD (аналогично GET, но на сервере отсутствует блок данных ответа)
  • POST (клиент отправляет блок данных, сервер отвечает блоком данных)
  • PUT (клиент отправляет блок данных, сервер не отправляет блок данных)

Существует некоторая подразумеваемая семантика в выборе метода, в которой запросы GET никогда не изменяют состояние сервера, и их результаты могут кэшироваться и использоваться повторно (что позволяет браузеру переходить назад и вперед между страницами), в то время как запросы POST делают изменить состояние сервера - кстати, это то, что вы делаете, когда загружаете файл.

Итак, чтобы отправить файл, подготовьте запрос POST или PUT (в зависимости от того, ожидаете ли вы ответный документ или достаточно простого кода статуса подтверждения), который состоит из строки запроса, заголовки которого содержат дополнительные информация о протоколе («Host:», «User-Agent:», ...), заголовки, описывающие файл («Content-Type:», «Content-Length:», ...), пустая строка и содержимое файла и отправьте его по TCP-соединению, затем прочитайте обратно строку состояния, заголовки ответа и файл ответа (если вы его запросили).

1 голос
/ 06 марта 2012

Зависит от приложения сервера, как загрузить файл. Вам может потребоваться отправить файл, используя метод HTTP «POST» вместо «GET».

POST /your_uri HTTP/1.1
Host: www.yourhost.com
Content-type: application/x-www-form-urlencoded
Content-length: 41

filename=test.xml&data=yoururlencodeddata

Серверное приложение может ожидать файлы, закодированные с границами «multipart / form-data», что-то вроде этого:

Content-type: multipart/form-data, boundary=AaBb01x

--AaBb01x
content-disposition: form-data; name="yourfield"

Your field data
--AaBb01x
content-disposition: form-data; name="yourfilefield"; filename="filename.xml"
Content-Type: text/xml

<root>your xml data</root>
--AaBb01x
1 голос
/ 06 марта 2012

Если это файл XML, это легко.

Вы можете добавить Content-Type: text/xml в заголовок HTTP и добавить данные файла XML после \r\n\r\n заголовка HTTP и отправить его через сокет на веб-сервер.

Веб-сервер будет понимать из заголовка HTTP, что он содержит файл XML, и принимает файл. В случае бинарного файла вам необходимо преобразовать его в base64.

Например, я использовал буфер для хранения http-запроса. Теперь, если вы отправите этот буфер в сокет, подключенный к веб-серверу, FileName.xml будет сохранен в веб-сервере. Чтобы это работало, upload.php должен уметь работать с данными POST. Граница должна показать границу между данными и необходима для протокола HTTP. Это может быть любое случайное сгенерированное число, и убедитесь, что начальная и близкая границы равны. Также длина содержимого - это длина файла. `

char buf[2048] =  "POST http://www.nameofyoursite.com/upload.php HTTP/1.1\r\n"
                                                "Host: www.nameofyoursite.com\r\n"
                                                "Content-Type: multipart-form-data, boundary=1234567\r\n"
                                                "Content-Length: 15\r\n\r\n"
                    "--1234567\r\n"
                    "Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"FileName.xml\"\r\n"
                    "Content-Type: text/xml\r\n"
                    "<xml>This is a test</xml>\r\n"
                    "--1234567--\r\n";

`

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