使用Servlet实现动态文件下载的方法
实现动态文件内容的下载:
1.Servlet必须告诉浏览器其所输出的内容的类型不是普通的文本文件或HTML文件,而是要保存到本地的一个下载文件.下面程序中详细解说. 2.需要通过HttpServletResponse.setHeader方法设置Content-Disposition头的值为"attachment;filename=文件名", 3.因为下载的文件可能是各种类型.所以如果要将内容传送给客户端,就应将其作为二进制处理.这时就要使用HttpServletResponse.getOutputStream方法而不是getWriter方法.下面是一个简单的例程:
1. MyServlet.java文件: package cn.itcast;import java.io.File;
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream;import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class MyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //设置ContentType头字段的值为浏览器无法使用某种方式打开或激活某个程序来处理的类型. //可以为application/x-msdownload或者application/octet-stream response.setContentType("application/x-msdownload;charset=gb2312"); //设置Content-Disposition头的值为"attachment;filename=文件名" response.addHeader("Content-Disposition", "attachment;filename=web.xml"); //从response中获得一个ServletOutputStream ServletOutputStream sops = response.getOutputStream(); //从服务器上获得一个文件,这里用的是下面的web.xml文件. String s = getServletContext().getRealPath("WEB-INF//web.xml"); File file = new File(s); InputStream ips = new FileInputStream(file);byte[] content = new byte[(int) file.length()];
ips.read(content); //将文件内容写入到输出流中发送给客户端 sops.write(content); ips.close(); sops.close(); }}
2.
test.html文件.其中有一个超链接指向上面的Servlet. <html> <body> <A href="servlet/MyServlet">下载附件</A> </body> </html>3.web.xml
注册Servlet,并指定其映射的URL <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>cn.itcast.MyServlet</servlet-class> </servlet><servlet-mapping>
<servlet-name>MyServlet</servlet-name> <url-pattern>/servlet/MyServlet</url-pattern> </servlet-mapping></web-app>