1. ホーム
  2. http

[解決済み] HTTPファイルアップロードの仕組みを教えてください。

2022-03-15 18:36:35

質問

このような簡単なフォームにファイルを添付して送信した場合。

<form enctype="multipart/form-data" action="http://localhost:3000/upload?upload_progress_id=12344" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="100000" />
Choose a file to upload: <input name="uploadedfile" type="file" /><br />
<input type="submit" value="Upload File" />
</form>

内部ではどのようにファイルを送信しているのでしょうか?ファイルはHTTPボディの一部としてデータとして送信されるのでしょうか?このリクエストのヘッダには、ファイル名に関するものは見当たりません。

ファイル送信時のHTTPの内部動作が知りたいだけなんです。

どのように解決するのですか?

ファイルを選択してフォームを送信するとどうなるかを見てみましょう(簡潔にするためにヘッダーを切り捨てています)。

POST /upload?upload_progress_id=12344 HTTP/1.1
Host: localhost:3000
Content-Length: 1325
Origin: http://localhost:3000
... other headers ...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryePkpFF7tjBAqx29L

------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="MAX_FILE_SIZE"

100000
------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-Disposition: form-data; name="uploadedfile"; filename="hello.o"
Content-Type: application/x-object

... contents of file goes here ...
------WebKitFormBoundaryePkpFF7tjBAqx29L--

注:各境界文字列の前に、追加の -- 最後の境界文字列の最後と同じように。上の例ではすでにこれを含んでいますが、見逃しやすいかもしれません。以下の @Andreas のコメントを参照してください。

フォームパラメータをURLエンコードする代わりに、フォームパラメータ(ファイルデータを含む)をリクエストのボディにあるマルチパートドキュメントのセクションとして送ります。

上の例では、入力された MAX_FILE_SIZE という値をフォームに設定し、さらにファイルデータを含むセクションを作成します。 ファイル名は Content-Disposition ヘッダを表示します。

詳細な内容は こちら .