Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> response output stream content length 
:(
    Опции темы
gelo86
Дата 9.12.2008, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 388
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Добрый вечер. У меня есть сервис каторий генерируэт пдф и записываэт его прама в OutputStream. Этот пдф будет скачан через бровзер (download). Знаю, что бивает что скачаеш пдф а открит не можеш (пишет что broken document - adobe reader). Если перед записю в OutputStream запишеш сколко занемает скачеваемый фаил, то все работает. У меня ситуация такая, что я генерирую на лету фаил дла скачки и сразу записаваю в OutputStream (если сначала в масив баитов то палучаю out of memore error). Как узнать, сколко же баитов било записано в os, после визова  myServiceObject,generatePDF(os);.


Код

public void service(HttpServletRequest req, HttpServletResponse res) [
   ...
   OutputStream os = res.getOutputStream();
   myServiceObject,generatePDF(os);
   response.setContentLength( ???? )
   os.flush();
   os.close();
   ...
}


PM MAIL   Вверх
necromancer
Дата 10.12.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



1. можно увеличить размер памяти под JVM
2. можно попробовать проставить размер больший и статичный
3. можно попробовать проставить размер -1
4.  можно файл писать на диск, а затем отдавать пользователю.

выставлять ContentLength необходимо перед отдачей данных в поток.


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
COVD
Дата 10.12.2008, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Наверняка вы используете стандартный веб контейнер (Томкат , например), и проблема скорее всего в том, что вы что-то лишнее делаете. 

Если заранее обьем респонса не известен (как раз ваш случай), то согласно протоколу http 1.1 (определяется контейнером из запроса) контейнер будет использовать chunked режим, а в http 1.0 конец данных определяется закрытием соединения. В обоих случаях не надо использовать setContentLength (..). Также и закрывать соединение не обязательно - контейнер сам сделает.
PM MAIL   Вверх
necromancer
Дата 11.12.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



to COVD: 
ну получит клиент 30кб вместо 30Мб и будет думать что все прошло отлично и сохраненный кусок полный.


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
COVD
Дата 11.12.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Цитата

ну получит клиент 30кб вместо 30Мб и будет думать что все прошло отлично и сохраненный кусок полный.


так для того и протокол, чтобы не "думать". 
PM MAIL   Вверх
skhilkov
Дата 12.12.2008, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 371
Регистрация: 11.4.2006
Где: TOMSK

Репутация: 2
Всего: 7



COVD, 
не соглачен ) HTTP протокол достаточно ненадежный. Если хочется проверить что до клиента дошло все как надо, то лучше проверять длину/контрольную сумму. ИМХО конечно.


--------------------
Кто понял жизнь, тот не спешит. 
PM MAIL   Вверх
COVD
Дата 12.12.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Цитата

HTTP протокол достаточно ненадежный


Возможно, ненадежно, когда конец данных определяется разрывом соединения - соединение может быть аварийно разорвано в середине данных. Но этот способ применялся в HTTP 1.0. В версии 1.1 используется chunked -  сервер отправляет данные порциями, и перед каждой порцией высылает ее размер. Вроде надежней некуда. 

Если не ошибаюсь, сервлеты "заточены" под динамические данные и автоматом используют "chunked".    

Не говоря о том, что новомодные технологии ajax , comet базируются на chunked.

Это сообщение отредактировал(а) COVD - 12.12.2008, 17:21
PM MAIL   Вверх
Tony
Дата 12.12.2008, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

Репутация: 6
Всего: 12



Зака4ай в ByteArrayOutputStream out, потом посмотри size(), и затетм out.writeTo(servletOutputStrem)


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0736 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.