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

задача: есть на сервере 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
Вопрос по HTTP, Servlet, передача бинарного файла
    #33646141
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доп. информация.

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

2. В Mozille все проходит нормально.
Т.е. проблема только с IE. Так в чем же эта проблема ?
...
Рейтинг: 0 / 0
Вопрос по HTTP, Servlet, передача бинарного файла
    #33646142
am_sasa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй
Content-Disposition: file; filename=
...
Рейтинг: 0 / 0
Вопрос по HTTP, Servlet, передача бинарного файла
    #33646165
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
при Content-Disposition: file; filename=
12.txt - сразу открывает в IE
12.txt.zip - ошибки теже (описаны в первом посте)
...
Рейтинг: 0 / 0
Вопрос по HTTP, Servlet, передача бинарного файла
    #33646287
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
Вопрос по HTTP, Servlet, передача бинарного файла
    #33646492
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, заработало, только в другой последовательности:
Код: 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
Вопрос по HTTP, Servlet, передача бинарного файла
    #33649663
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В догонку еще один вопрос:

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


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