Я создал сервлет, который считывает содержимое файла в массив байтов, который впоследствии записывается в OutputStream ответа:

// set headers
resp.setHeader("Content-Disposition","attachment; filename=\"file.txt\"");
resp.setHeader("Content-Length", "" + fileSize);

// output file content.
OutputStream out = resp.getOutputStream();
out.write(fileBytes);
out.close();

Я также написал «клиента», который должен узнать, насколько велик файл. Это должно быть достаточно просто, поскольку я добавил заголовок Content-Length.

URLConnection conn = url.openConnection();
long fileSize = conn.getContentLength();

Однако я немного не уверен в общей картине. Насколько я понимаю мой собственный сервлет, все содержимое файла выгружается в OutputStream ответа. Однако приводит ли вызов getContentLength () к частичной или полной загрузке фактических данных файла? Другими словами, когда я вызываю conn.getContentLength (), какая часть файла будет возвращена с сервера? Заголовки идут «отдельно» от содержимого?

Весь вклад высоко оценен!

0
sbrattla 26 Авг 2011 в 13:16

2 ответа

Лучший ответ

Однако приводит ли вызов getContentLength () к частичной или полной загрузке фактических данных файла?

Нет, метод getContentLength() просто возвращает строковое значение размера содержимого как целое число.

Другими словами, когда я вызываю conn.getContentLength (), какая часть файла будет возвращена с сервера?

Ни один файл не будет загружен.

Заголовки идут «отдельно» от содержимого?

Да, заголовки идут «отдельно» от содержимого.

Теперь ты уверен: D

2
gotomanners 26 Авг 2011 в 09:26

См. javadocs.

Возвращает значение поля заголовка content-length.

Таким образом, вызов getContentLength() просто считывает значение заголовка и не вызывает загрузки. Для этого вам нужно позвонить getContent().

1
Kees de Kooter 26 Авг 2011 в 09:19