Ответ 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 для его анализа.