Загрузка сервлета с загрузкой файлов, Почему больше, чем оригинал?

Servlet 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();

Дозовый запрос getInputStream Метод принимает информацию заголовка http?

Почему загруженный файл больше оригинала?

Ответ 1

Отправка файлов в HTTP-запрос обычно выполняется с использованием multipart/form-data encoding. Это позволяет серверу различать несколько частей данных формы в одном запросе (иначе было бы невозможно отправить несколько файлов и/или поля ввода в одном запросе). Каждая часть разделяется границей и предшествует заголовкам данных формы. Весь запрос выглядит примерно так: пример с 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 для его анализа.

См. также: