Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача бинарного файла клиенту из JSP

www.javaportal.ru

Рассмотрим такой сценарий. При заходе на jsp страницу, клиент вводит в поле формы путь к файлу и отсылает ее на сервер. Если путь корректен, то сервер передает соответствующий файл кленту. При этом браузер запрашивает вариант загрузки.

Какой должна быть jsp?

Если запрос не содержит путь к файлу (параметр getfile), тогда выводится html страница с формой для указания пути.

Если содержит, тогда получаем его и устанавливаем параметры заголовка ответа. Дело в том, что когда сервером посылаются не текстовые данные в параметре Content-Type надо указать их тип. Если это бинарный поток, тогда они имеют тип "application/octet-stream". А имя скачиваемого файла браузер узнает из дополнительного параметра Content-Disposition.

Ну а дальше все просто. Открывается поток на чтение указанного файла, определяется выходной поток к клиенту (в данном случае, предопределенный поток out использоваться не может, так как он предназначен только для вывода текстовых данных) и данные из входного передаются в выходной. Вот и все. Конкретная реализация представлена ниже.

//filearchive.jsp
//------------------------------------------
<%@ page import="java.io.*" %>
<%
 if(request.getParameter("getfile")!=null)
 {//Если в запросе указан путь к файлу
  
  //его будет содержать filename
  String filename=request.getParameter("getfile");
  
  //Выставляем заголовок ответа
  response.setHeader("Content-Type","application/octet-stream;");
  
  //Выделяем из полного пути файла его имя
  String shortname=filename.substring(filename.lastIndexOf("\\")+1,
                   filename.length());
  response.setHeader("Content-Disposition",
                   "filename=\""+shortname+"\"");
  try
  {
   BufferedInputStream in=new 
         BufferedInputStream (new FileInputStream (filename));
   BufferedOutputStream binout=new 
         BufferedOutputStream(response.getOutputStream());
   int ch=in.read();
   while(ch!=-1)
   {
    binout.write(ch);
    ch=in.read();
   }
   binout.close();
   in.close();
  }
  catch(IOException ioe)
  {
   out.println("Unable to get access");
  }
 }  
 else
 {
  %>
<html>
<head>
<title>
Files archive
</title>
</head>
<body>
 <% 
  //Получаем полный собственный URL. 
  //Он используется в обработчике формы.
  String hostURL=request.getRequestURL().toString();
 %>
<h1 align="center">Welcome to our files archive</h1>
<form action="<%=hostURL%>">
<center>
Input path to the file: <input type="text" name="getfile">
<input type="submit">
</center>
</form>
</body>
</html>

<% 
} 
%>

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
Мне нравитсяМне не нравится
26 апреля 2006, 14:13:28
То что долго искал. Спасибо! но не понятно почему выводится на сервере ошибка
java.lang.IllegalStateException: getOutputStream() has already been called for this response
2.
Аноним
Мне нравитсяМне не нравится
26 января 2006, 08:15:56
А если в имени файла присутствуют русские буквы, тогда проблемы с передачей его имени браузеру. И как их решать, где и как указать нужную (и какую) кодировку?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог