Отправка файла через POST с использованием необработанного HTTP (PuTTY)

Если я настрою HTML-страницу со следующей формой:

<html>

    <body>
        <form action="upload_file.php"
              method="post"
              enctype="multipart/form-data">

            <label for="file">Filename:</label>
            <input type="file" name="file" id="file" />
            <br />
            <input type="submit" name="submit" value="Submit" />
        </form>
    </body>

</html>

Я могу загрузить файл в upload_file.php, где я могу обработать его с помощью PHP-скрипта.

В целях тестирования мне нужно сделать то же самое, используя необработанный HTTP через сеанс PuTTY.

Я могу сделать обычный POST (просто отправив текстовые данные) следующим образом:

POST /test_post.php HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

name=myname

Как я могу отправить файл таким образом?


person xbonez    schedule 26.09.2011    source источник


Ответы (2)


Вы должны использовать multipart тип содержимого и кодировать данные файла в шестнадцатеричном/двоичном формате.

Попробуйте в телнете следующее:

POST /the_url HTTP/1.1
User-Agent: Mozilla
Host: www.example.com
Content-Length: xxxx
Content-Type: multipart/form-data; boundary=--------------------31063722920652
------------------------------31063722920652
Content-Disposition: form-data; name="a"

value_for_a
------------------------------31063722920652
Content-Disposition: form-data; name="b"

value_for_b
------------------------------31063722920652
Content-Disposition: form-data; name="c"; filename="myfile.txt"
Content-Type: text/plain

            This is a test 
            and more

-----------------------------31063722920652
Content-Disposition: form-data; name="submit"

Submit
-----------------------------31063722920652--

Помните, что между именем поля и его данными необходим дополнительный перевод строки. Также обновите значение Content-Length.

person Aziz Shaikh    schedule 26.09.2011
comment
Как мне разместить файл в новой длине содержимого? Будет ли это размер файла в байтах? - person xbonez; 26.09.2011
comment
Я завершил необработанные данные в своем ответе. Теперь он содержит полезную нагрузку текстового файла. Content-Length будет полным размером полезной нагрузки (включая файл) в байтах. - person Aziz Shaikh; 26.09.2011
comment
Content-Length — это размер в байтах данных, которые отправляются, начиная с первого boundary до последнего. - person Aziz Shaikh; 26.09.2011
comment
Подскажите, пожалуйста, что означает число 31063722920652 в запросе? - person Hemal Chevli; 30.10.2015
comment
@HemalChevli это произвольное значение, вы можете установить его на что угодно. Я думаю, что ограничение составляет 70 байт. Это значение разделителя не должно отображаться в данных запроса, иначе оно будет рассматриваться как граница. - person Aziz Shaikh; 30.10.2015

Откройте порт с помощью netcat и сохраните входящий запрос:

nc -l -p 1090 > income-http.txt

Затем измените форму, чтобы отправить данные в netcat:

<form action="http://localhost:1090/upload_file.php" 
    method="post" enctype="multipart/form-data">

Отправьте форму из браузера. Вы можете найти полный необработанный запрос с содержимым файла в файле income-http.txt.

Сохранение income-http.txt — это одноразовое действие. Позже вы можете отправить сохраненный запрос в любое время. Обратите внимание, что вы должны отредактировать заголовок Host: в сохраненном тексте.

person palacsint    schedule 26.09.2011
comment
Мне очень нравится идея возможности анализировать входящий запрос. Но, к сожалению, открытие порта для меня не вариант. Есть ли альтернатива этому? - person xbonez; 26.09.2011
comment
Вы должны сделать это только на своей локальной машине и только один раз. После того, как вы получите доход-http.txt, вы можете отправить его в любое время. - person palacsint; 26.09.2011
comment
О, вы имеете в виду, что я открываю порт на локальной машине и мне не нужно перенаправлять его на маршрутизатор? У меня нет доступа к роутеру. Я попробую netcat. - person xbonez; 26.09.2011
comment
кстати, можно ли установить netcat на мой веб-сервер linux? - person xbonez; 26.09.2011
comment
Да, только на локальной машине, вам не нужно никуда его направлять. Он просто сохраняет входящий запрос в txt файл и после сохранения он вам больше не понадобится. Установка Netcat: aptitude install netcat в Debian. Другие дистрибутивы обычно также имеют пакет netcat. - person palacsint; 26.09.2011