5

ファイルのアップロードを処理するサーブレット doPost

    InputStream in = req.getInputStream();

    File file = new File("c:/8.dat");
    OutputStream out = new FileOutputStream(file);
    byte[] buffer = new byte[1024];

    int len =0;
    while((len=in.read(buffer))!=-1){
        out.write(buffer, 0, len);
    }
    bao.close();
    out.close();
    in.close();

Dose Request の getInputStream Method は http ヘッダー情報を取得しますか?

アップロードされたファイルが元のファイルよりも大きいのはなぜですか?

4

1 に答える 1

8

HTTP 要求でのファイルの送信は、通常、multipart/form-dataエンコードを使用して行われます。これにより、サーバーは単一の要求で複数のフォーム データ パーツを区別できます (そうでなければ、単一の要求で複数のファイルや入力フィールドを送信することはできません)。各部分は境界で区切られ、フォーム データ ヘッダーが先行します。リクエスト本文全体はおおまかに次のようになります ( namesの3 つのプレーン<input type="text">フィールドと、値 が入力されたフォームの例を取り上げます):name1name2name3value1value2value3

--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 を使用して解析できます。

以下も参照してください。

于 2012-11-15T14:21:56.153 に答える