Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по HTTP, Servlet, передача бинарного файла / 9 сообщений из 9, страница 1 из 1
05.04.2006, 13:19
    #33646074
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HTTP, Servlet, передача бинарного файла
Сдаюсь. Требуется помощь зала.

задача: есть на сервере 2 файла
12.txt (текстовый)
12.txt.zip (зазипованный вариант)

требуется передать клиенту по запросам из браузера (MS IE) типа:
http://192.168.110.152:62301/MyApp/12.txt
http://192.168.110.152:62301/MyApp/12.txt.zip
да так, чтобы броузер предложил сохранить файл.

код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
BufferedInputStream from =  null ;
 try  {
   File file =  new  File( new  URI(fileName)); // здесь fileName - уже реальный путь типа file:///se3511_pool2/s/home/results/user/12.txt
    if  (file.exists()) {
          int  pz = fileName.lastIndexOf('/');
         String shortFileName=fileName.substring(pz+ 1 );
         response.setContentLength(( int ) file.length());
         String mimeType = session.getServletContext().getMimeType(fileName);
         response.setContentType(mimeType);
         response.setHeader("Content-disposition", "attachment; filename=\""+shortFileName+"\"");
          int  bufferSize =  64  *  1024 ;
         from =  new  BufferedInputStream( new  FileInputStream(file), bufferSize *  2 );
         ServletOutputStream out = response.getOutputStream();
          byte [] bufferFile =  new   byte [bufferSize];
          for  ( int  i =  0 ; ; i++)  {
                   int  len = from.read(bufferFile);
                   if  (len <  0 )
                         break ;
                  out.write(bufferFile,  0 , len);
         }
         out.flush();
   }  else  {
        response.getWriter().println("requested file "+pfileName + " not found");
   }
}  catch  (URISyntaxException e) {
    e.printStackTrace(Log.getInstance().out);
}  finally {
             if  (from !=  null ) {
                    from.close();
                    from =  null ;
          }
}   

результаты: с файлом 12.txt проходит нормально.
Но с 12.txt.zip IE ругается выдавая окно
"загрузка файла"
получение сведений о файле 12.txt.zip с 192.168.110.152

тут же поверх выдает окно
"не удается загрузить 12.txt.zip с 192.168.110.152
Не удается открыть этот узел Интернета. Узел недоступен или не найден. Повторите попытку позднее."

Есля я указываю явно
response.setContentType("application/octet-stream");
то эффект тот же.

Вопрос: что я делаю не так в случае с архивированным файлом ?
...
Рейтинг: 0 / 0
05.04.2006, 13:37
    #33646141
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HTTP, Servlet, передача бинарного файла
Доп. информация.

1. на самом деле, с текстовым файлом все нормально проходит только если сервлет отвечает на запрос POST.
на GET же, как в задаче выше, при выводе в IE - показывает нормально, а при попытке сохранить - эффект такой же, как и при зипованном варианте.

2. В Mozille все проходит нормально.
Т.е. проблема только с IE. Так в чем же эта проблема ?
...
Рейтинг: 0 / 0
05.04.2006, 13:38
    #33646142
am_sasa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HTTP, Servlet, передача бинарного файла
Попробуй
Content-Disposition: file; filename=
...
Рейтинг: 0 / 0
05.04.2006, 13:44
    #33646165
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HTTP, Servlet, передача бинарного файла
при Content-Disposition: file; filename=
12.txt - сразу открывает в IE
12.txt.zip - ошибки теже (описаны в первом посте)
...
Рейтинг: 0 / 0
05.04.2006, 14:17
    #33646287
Вопрос по HTTP, Servlet, передача бинарного файла
Igor-65
Код: plaintext
1.
2.
3.
4.
response.setContentLength((int) file.length());
String mimeType = session.getServletContext().getMimeType(fileName);
response.setContentType(mimeType);
response.setHeader("Content-disposition", "attachment; filename=\""+shortFileName+"\"");

Замени этот код на:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
response.setContentLength((int) file.length());
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment");
response.setHeader("Accept-Ranges", "none");
response.setDateHeader("Last-Modified", file.lastModified());
//по желанию, еще можно:
response.setDateHeader("Expires", System.currentTimeMillis());
response.setHeader("Cache-Control", "must-revalidate");
У меня похожий код работает со всеми браузерами.
...
Рейтинг: 0 / 0
05.04.2006, 14:59
    #33646492
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HTTP, Servlet, передача бинарного файла
Спасибо, заработало, только в другой последовательности:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
   response.setContentType("application/octet-stream");
   response.setDateHeader("Expires", System.currentTimeMillis());
   response.setHeader("Cache-Control", "must-revalidate");                
   response.setHeader("Accept-Ranges", "none");
   response.setDateHeader("Last-Modified", file.lastModified());
   response.setHeader("Content-disposition", "attachment;filename="+shortFileName);
далее тело файла
...
Рейтинг: 0 / 0
06.04.2006, 16:23
    #33649663
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HTTP, Servlet, передача бинарного файла
В догонку еще один вопрос:

если
Код: plaintext
1.
response.setHeader("Content-disposition", "attachment;filename=101.zip");
то MS IE предлагает сохранить файл 101.zip
(что, в общем то разумно :) )

однако, если
Код: plaintext
1.
response.setHeader("Content-disposition", "attachment;filename=101.txt.zip");
то MS IE предлагает сохранить файл 101[1].txt.zip

Вопрос залу: можно ли заставить его предлагать то имя, которое указано ?
...
Рейтинг: 0 / 0
06.04.2006, 17:12
    #33649928
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HTTP, Servlet, передача бинарного файла
Igor-65Вопрос залу: можно ли заставить его предлагать то имя, которое указано ?
чисто без всякого основания на разумность: а если имя файла в кавычки заключить?
Код: plaintext
1.
response.setHeader("Content-disposition", "attachment;filename=\"101.txt.zip\"");
...
Рейтинг: 0 / 0
06.04.2006, 17:31
    #33650017
Igor-65
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по HTTP, Servlet, передача бинарного файла
Не поверите, вчера пробовал :) - не помогло.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по HTTP, Servlet, передача бинарного файла / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]