一、采用RequestDispatcher的方式进行
1、web.xml文件中增加
<mime-mapping>
<extension>doc</extension>
<mime-type>application/vnd.ms-word</mime-type>
</mime-mapping>
2、程序如下:
< %@page language="java" import="java.net.*" pageEncoding="gb2312"%>
<%
response.setContentType("application/x-download");//设置为下载application/x-download
String filenamedownload = "/ 系统解决方案 .doc";// 即将下载的文件的相对路径
String filenamedisplay = " 系统解决方案 .doc";// 下载文件时显示的文件保存名称
filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8");
response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay);
try
{
RequestDispatcher dispatcher = application.getRequestDispatcher(filenamedownload);
if(dispatcher != null)
{
dispatcher.forward(request,response);
}
response.flushBuffer();
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
}
%>
二、采用文件流输出的方式下载
1、web.xml文件中增加
<mime-mapping>
<extension>doc</extension>
<mime-type>application/vnd.ms-word</mime-type>
</mime-mapping>
2、程序如下:
< %@page language="java" contentType="application/x-msdownload" import="java.io.*,java.net.*" pageEncoding="gb2312"%>
<%
//关于文件下载时采用文件流输出的方式处理:
// 加上 response.reset() ,并且所有的%>后面不要换行,包括最后一个;
// 因为 Application Server 在处理编译 jsp 时对于%>和<%之间的内容一般是原样输出,而且默认是PrintWriter,
// 而你却要进行流输出: ServletOutputStream ,这样做相当于试图在 Servlet 中使用两种输出机制,
// 就会发生: getOutputStream() has already been called for this response 的错误
// 详细请见《 More Java Pitfill 》一书的第二部分 Web 层 Item 33 :试图在 Servlet 中使用两种输出机制 270
// 而且如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如 AutoCAD 、 Word 、 Excel 等文件
// 下载下来的文件中就会多出一些换行符 0x0d 和 0x0a ,这样可能导致某些格式的文件无法打开,有些也可以正常打开。
response.reset();// 可以加也可以不加
response.setContentType("application/x-download");// 设置为下载 application/x-download
// /../../ 退 WEB-INF/classes 两级到应用的根目录下去,注意 Tomcat 与 WebLogic 下面这一句得到的路径不同,WebLogic 中路径最后没有 /
System.out.println(this.getClass().getClassLoader().getResource("/").getPath());
String filenamedownload = this.getClass().getClassLoader().getResource("/").getPath() + "/../../ 系统解决方案 .doc";
String filenamedisplay = " 系统解决方案 .doc";// 系统解决方案 .txt
filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8");
response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay);
OutputStream output = null;
FileInputStream fis = null;
try
{
output = response.getOutputStream();
fis = new FileInputStream(filenamedownload);
byte[] b = new byte[1024];
int i = 0;
while((i = fis.read(b)) > 0)
{
output.write(b, 0, i);
}
output.flush();
}
catch(Exception e)
{
System.out.println("Error!");
e.printStackTrace();
}
finally
{
if(fis != null)
{