Передача бинарного файла клиенту из JSP
Рассмотрим такой сценарий. При заходе на 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> <% } %>
Оставить комментарий
Комментарии
java.lang.IllegalStateException: getOutputStream() has already been called for this response