<form enctype=multipart/form-data>
Webサーバーにファイルをアップロードするときになぜ必要なのですか?
2 に答える
これは、ブラウザがHTTPを介して送信するためにバイナリおよびフォームデータをパッケージ化する方法と関係があります。デフォルトではフォームデータのみが送信されますが、フォームがファイルのアップロードをサポートする必要がある場合は、バイナリデータも追加してフォームデータから分離する必要があります。
スコット・ハンゼルマンはここでこれについて良い説明をしています:
HTTPとHTTPを介したファイルアップロードのしくみ
私にとって、何かが起こっている理由と方法を理解することは常に良いことです。「理由だけで」や「何でも、それを追加すればうまくいく」と言えば、それは悲しいことだと思います。何らかの理由で、多くの人がFORM POSTを理解し、一般的にフォームデータがサーバーに渡される方法を理解していますが、ファイルが転送されると、多くの人はそれが魔法だと結論付けます。ファイルのアップロードを含むフォームにenctype="multipart / form = data"を追加する必要があるのはなぜですか?フォームは複数の部分にPOSTされるようになるためです。
このようなフォームがある場合:
<form action="/home/uploadfiles" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="Submit" />
</form>
結果のフォームPOSTは次のようになります(少し簡略化されています)。
POST /home/uploadfiles HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------7d81b516112482
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64)
Content-Length: 324
-----------------------------7d81b516112482
Content-Disposition: form-data; name="file"; filename="\\SERVER\Users\Scott\test.txt"
Content-Type: text/plain
foo
-----------------------------7d81b516112482
Content-Disposition: form-data; name="submit"
Submit
-----------------------------7d81b516112482--
このPOSTに関するいくつかのことに注意してください。まず、content-typeとboundary = ""に注意し、後で境界がどのように使用されるか、まさにそのように、複数の部分の間の境界に注意してください。最初の部分で、text/plainタイプの単一のファイルをアップロードしたことがどのように示されているかを確認してください。これから、すべてが一度にPOSTされた場合に複数のファイルが表示されると予想される方法を補間できます。
そしてもちろん、enctype = "multipart / form = data"が含まれていない基本的なフォームPOSTの場合、これがどのように異なるかを見てください。
POST /home/uploadfiles HTTP/1.1
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64)
Content-Length: 13
submit=Submit
コンテンツタイプがどのように異なるかをご覧ください。これは通常の典型的なフォームPOSTです。送信ボタンのみが含まれているという点で、おそらく非定型です。...。
余談ですが、複数のファイルが添付されたメールを見ると、ほとんどの優れたアイデアで一般的であるように、マルチパートMIMEエンコーディングがどこにでもあるため、最初のHTTPメッセージの本文と非常によく似ています。