2010-11-21 7 views
58

誰が私と一緒に含まれているマルチパート/フォームデータの例を共有することができます場合、私は疑問に思って:

  1. いくつかのフォームパラメータ
  2. 複数のファイル
+1

は、httpを参照してください。 com/forms/form_enctype.html –

+0

[複数のファイルを含むマルチパートHTTPリクエストはどのように見えるのですか?](http://stackoverflow.com/questions/913626/what-should-a-multipart-http-request-複数ファイルのように) –

+1

ここに移動: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4「17.13.4フォームのコンテンツタイプ」では –

答えて

77

EDIT:私は同様の、より詳細な回答を次のところで維持しています:https://stackoverflow.com/a/28380690/895245

何が起こっているのかを正確に見るにはse nc -lまたはECHOサーバーとブラウザーまたはcURLのようなユーザーエージェント。

.htmlファイルにフォームを保存:ファイルを選択し、

nc -l localhost 8000 

開き、ブラウザのHTML:

<form action="http://localhost:8000" method="post" enctype="multipart/form-data"> 
    <p><input type="text" name="text" value="text default"> 
    <p><input type="file" name="file1"> 
    <p><input type="file" name="file2"> 
    <p><button type="submit">Submit</button> 
</form> 

は、アップロードするファイルを作成します。

echo 'Content of a.txt.' > a.txt 
echo '<!DOCTYPE html><title>Content of a.html.</title>' > a.html 

ランsubmitをクリックして端末を確認してください。

ncは、受け取った要求を印刷します。 Firefoxが送ら:

POST/HTTP/1.1 
Host: localhost:8000 
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Cookie: __atuvc=34%7C7; permanent=0; _gitlab_session=226ad8a0be43681acf38c2fab9497240; __profilin=p%3Dt; request_method=GET 
Connection: keep-alive 
Content-Type: multipart/form-data; boundary=---------------------------9051914041544843365972754266 
Content-Length: 554 

-----------------------------9051914041544843365972754266 
Content-Disposition: form-data; name="text" 

text default 
-----------------------------9051914041544843365972754266 
Content-Disposition: form-data; name="file1"; filename="a.txt" 
Content-Type: text/plain 

Content of a.txt. 

-----------------------------9051914041544843365972754266 
Content-Disposition: form-data; name="file2"; filename="a.html" 
Content-Type: text/html 

<!DOCTYPE html><title>Content of a.html.</title> 

-----------------------------9051914041544843365972754266-- 

Aternativelly、カールは、ブラウザのフォームと同じPOSTリクエストを送信する必要があります:@へ

while true; do printf '' | nc -l localhost 8000; done 
+12

不快で即座に明らかでないもの: 'boundary = --------------------------- 9051914041544843365972754266'は* 2つのハイフンが短い*データの実際の境界。これは本当に、本当に**すべてのハイフンが一緒に繋がっているのを見るのは難しい**です。 –

3

感謝:

nc -l localhost 8000 
curl -F "text=default" -F "[email protected]" -F "[email protected]" localhost:8000 

あなたがで複数のテストを行うことができますCiro Santilliの答え!実際には、@Fake Nameがコメントしたように、あなたの境界内でリクエストを使用しているときには、前面に2つのハイフンがついています:

例:境界のための彼の選択は非常に "不幸"

POST/HTTP/1.1 
HOST: host.example.com 
Cookie: some_cookies... 
Connection: Keep-Alive 
Content-Type: multipart/form-data; boundary=12345 

--12345 
Content-Disposition: form-data; name="sometext" 

some text that you wrote in your html form ... 
--12345 
Content-Disposition: form-data; name="name_of_post_request" filename="filename.xyz" 

content of filename.xyz that you upload in your form with input[type=file] 
--12345 
Content-Disposition: form-data; name="image" filename="picture_of_sunset.jpg" 

content of picture_of_sunset.jpg ... 
--12345-- 


Iは単に混合/マルチ内部別の境界文字列を選択し、データをincapsulateために、そのいずれかを使用して、マルチパート/フォームデータで混合/マルチパートヘッダをincapsulateすることが可能であるon this w3.org pageを発見しました。最後には、「クローズ」POSTリクエスト(のように閉じるようにFILOのために使用されるすべての境界なければなりません。//www.htmlcodetutorial:

POST/HTTP/1.1 
... 
Content-Type: multipart/form-data; boundary=12345 

--12345 
Content-Disposition: form-data; name="sometext" 

some text sent via post... 
--12345 
Content-Disposition: form-data; name="files" 
Content-Type: multipart/mixed; boundary=abcde 

--abcde 
Content-Disposition: file; file="picture.jpg" 

content of jpg... 
--abcde 
Content-Disposition: file; file="test.py" 

content of test.py file .... 
--abcde-- 
--12345-- 

は、上記のリンクを見てみましょう

+0

'Content-Disposition'のすべてのプロパティを'; 'で区切っていないのはなぜですか? – kelin