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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Экспорт файла при помощи сервлета, что использовать? 
:(
    Опции темы
vzf
Дата 19.7.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У меня есть сервлет. Он получает из атрибута сессии массив байт соответствующий файлу. Вопрос как лучше передать этот файл в респонс?  Что лучше использовать OutputStream

Код

byte[] exportData = (byte[])session.getAttribute(session.getId() + SESSION_KEY);
response.getOutputStream().write(exportData);



или лучше открывать файл в сервлете  и использовать Writer ?

   
Код

                FileInputStream in = new FileInputStream(fileName);
                PrintWriter out = response.getWriter();
                InputStreamReader reader = new InputStreamReader(in);
                char[] buffer = new char[1024];
                int read;
                
                while((read = reader.read(buffer)) != -1){
                    out.write(buffer, 0, read);
                }
                
                out.flush();
                out.close();
                in.close();



--------------------
Java - Write Once, Test EveryWhere!
PM MAIL   Вверх
AntonSaburov
Дата 19.7.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Если побайтно, то надо открывать не Writer а OutputStream - это раз.

А также хорошо бы предварительно устанавливать MIME-type

response.setContentType("application/....."); // чего-то реальное - 

Тогда броузер попытается предложить записать файл на диск или открыть с помощью какого-либо приложения.

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


Опытный
**


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

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



между Writer и OutputStream по спецификации одна разница - тип передаваемых данных.
В первом случае это chars во втором это bytes.

Но проблема будет скорее даже не в этом, если предварителньо не сделать кое какие операции,
 то поток будет выведен в виде HTML страницы с неким набором непонятных символов.

Теперь следующее:
Если ты в поток пишешь просто HTML код, то тебе в принципе подойдут оба метода.
Если же ты пишешь binary данные то тебе к OutputStream.

А если ты ко всему прочему хочешь что бы появился диалог сохранения то:
Код

res.setContentType( "application/octet-stream" );
res.setHeader("Content-Disposition","attachment; filename=\"" + noname + "\"");
res.setHeader( "Pragma", "public" );
res.setContentLength(bytes.length);

Вместо octet-stream можно использовать соответсвующий тип документа, для ворда - msword

PS Эх штурман опередил =)
Но у меня есть ссылочка :Р на дисскусия на сан форуме Sun Forum

Это сообщение отредактировал(а) necromancer - 19.7.2007, 17:46


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


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Цитата(necromancer @  19.7.2007,  16:45 Найти цитируемый пост)
Эх штурман опередил =)

Да ладно - у тебя зато более подробно. Так что зачот smile
PM MAIL WWW ICQ   Вверх
vzf
Дата 19.7.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Content-type я устанавливаю тот который мне нужен c этим проблем нет. Хотелось бы услышать мнене какой подход лучше. Передавать массив байт сервлету, чтобы тот положил его в респонс при помощи OutPutStream или использовать Writer. Передававть лучше не побайтно.

Еще попутный вопрос что лучше использовать для "попадания" на сервлет в JSF (точнее в Facelets) :

outputLink
commandLink
commandButton

Просто иногда я получаю ошибку response already in use при редиректе на сревлет. Думаю может проблема в том как я файл записываю в респонс.

Добавлено через 5 минут и 17 секунд
Пока писал свое сообщение пропустил пару сообщений. итого для экспорта бинарных данных мне лучше использовать OutputStraem , я правильно понял ? Сейчас у меня  сервлет экспортирует и экселевские файлы и текстовые файлы лога, используя OutPutStream. 
--------------------
Java - Write Once, Test EveryWhere!
PM MAIL   Вверх
AntonSaburov
Дата 19.7.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Правильно понял. Правда Excel ныне неплохо понимает и обычный HTML, но для надежности smile
PM MAIL WWW ICQ   Вверх
necromancer
Дата 19.7.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Еще попутный вопрос что лучше использовать для "попадания" на сервлет в JSF (точнее в Facelets) :

outputLink
commandLink
commandButton


outputLink представляет собой что то вроде <a href="">text</a>
остальные компоненты (commandLink, commandButton) делаю form.submit() - т.е. "попадают" в JSF


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ 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.0552 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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