Для передачи файла клиенту и скрытия его месторасположения был написан
download.jsp. Вот его код:
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
<%@ page import ="java.io.*" %>
<% //Файл donload.jsp
@page import ="com.pb.analyse.*"%>
<%
// response.setHeader("Cache-Control", "no-cache");
if ( ( (request.getParameter("report")== null ) & (request.getParameter("task")== null ) ) || (session.getAttribute("log") == null ) || (session.getAttribute("log").equals(""))) {
response.sendRedirect("../index.jsp");
}
%>
<%
String filename=TaskManager.getInstance().GetTaskReportName(session.getAttribute("log").toString(),request.getParameter("task").toString(),request.getParameter("report").toString());
//Выделяем из полного пути файла его имя
String shortname=filename.substring(filename.lastIndexOf("\\")+1, filename.length());
response.setHeader("Content-Disposition", "attachment; filename=\""+shortname+"\"");
response.setHeader("Content-Transfer-Encoding","binary;");
String fileExt=shortname.substring(shortname.lastIndexOf(".")+ 1 ).toString();
//Выставляем заголовок ответа
String ContDispType="application/force-download";
if (fileExt.toString().equalsIgnoreCase("pdf")) { ContDispType="application/pdf"; }
if (fileExt.toString().equalsIgnoreCase("exe")) { ContDispType="application/octet-stream"; }
if (fileExt.toString().equalsIgnoreCase("zip")) { ContDispType="application/zip"; }
if (fileExt.toString().equalsIgnoreCase("doc")) { ContDispType="application/msword"; }
if (fileExt.toString().equalsIgnoreCase("xls")) { ContDispType="application/vnd.ms-excel"; } // "application/x-xls"
if (fileExt.toString().equalsIgnoreCase("ppt")) { ContDispType="application/vnd.ms-powerpoint"; }
if (fileExt.toString().equalsIgnoreCase("gif")) { ContDispType="image/gif"; }
if (fileExt.toString().equalsIgnoreCase("png")) { ContDispType="image/png"; }
if (fileExt.toString().equalsIgnoreCase("jpg")) { ContDispType="image/jpg"; }
if (fileExt.toString().equalsIgnoreCase("html")) { ContDispType="text/html"; }
if (fileExt.toString().equalsIgnoreCase("htm")) { ContDispType="text/html"; }
if (fileExt.toString().equalsIgnoreCase("txt")) { ContDispType="text/plain"; }
if (fileExt.toString().equalsIgnoreCase("dbf")) { ContDispType="application/x-dbf"; }
response.setHeader("Content-Type",ContDispType);
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");
}
%>
по кликам на ссылки типа download.jsp?task=1&report=2
все отлично работает - и под MSIE и под Firefox и из под Linux!
Вместо открытия в окне вылазит как и задумано окно Сохранить и в нем
имя нормально.
Но если я перед выводов добавляю:
GZIPOutputStream out1 = new GZIPOutputStream(response.getOutputStream());
BufferedOutputStream binout=new BufferedOutputStream(out1);
и в заголовок добавляю response.setHeader("Content-Encoding", "gzip");,
то вместо нормального имени уже в окне сохранения появляется
download.расширение.
Как сделать все таки упаковку при передаче и чтобы выставленное имя
назначалось файлу ? То есть основная идея была чтобы даже на ссылку на html-файл вызывалось не открытие ее в окно, а окно СОХРАНИТЬ.
Но добавление упаковки испортило функциональность. HELP PLEASE