Сервлет обрабатывает загрузку файлов, почему больше, чем оригинал?

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

Смотрите также:

Другие вопросы по тегам