HTTP 要求でのファイルの送信は、通常、multipart/form-data
エンコードを使用して行われます。これにより、サーバーは単一の要求で複数のフォーム データ パーツを区別できます (そうでなければ、単一の要求で複数のファイルや入力フィールドを送信することはできません)。各部分は境界で区切られ、フォーム データ ヘッダーが先行します。リクエスト本文全体はおおまかに次のようになります ( namesの3 つのプレーン<input type="text">
フィールドと、値 が入力されたフォームの例を取り上げます):name1
name2
name3
value1
value2
value3
--SOME_BOUNDARY
content-disposition: form-data;name="name1"
content-type: text/plain;charset=UTF-8
value1
--SOME_BOUNDARY
content-disposition: form-data;name="name2"
content-type: text/plain;charset=UTF-8
value2
--SOME_BOUNDARY
content-disposition: form-data;name="name3"
content-type: text/plain;charset=UTF-8
value3
--SOME_BOUNDARY--
名前を持つ単一の<input type="file">
フィールドを使用すると、file1
リクエスト本文全体は次のようになります。
--SOME_BOUNDARY
content-disposition: form-data;name="file1";filename="some.ext"
content-type: application/octet-stream
binary file content here
--SOME_BOUNDARY--
したがって、それは基本的にあなたが読んでいるものですrequest.getInputStream()
。リクエスト本文からバイナリ ファイルの内容を解析する必要があります。アップロードされたファイルが大きく見える (そして実際には破損している) のは、まさにその境界とフォーム データ ヘッダーです。サーブレット 3.0 を使用している場合は、request.getPart()
代わりに を使用して唯一のファイル コンテンツを取得する必要があります。
InputStream content = request.getPart("file1").getInputStream();
// ...
まだサーブレット 2.5 以前を使用している場合は、特に Apache Commons FileUpload を使用して解析できます。
以下も参照してください。