Сервлет обрабатывает загрузку файлов, почему больше, чем оригинал?
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 для его анализа.