转载自:http://blog.csdn.net/huazhizui/article/details/7401323

一个使用Servlet文件实现文件下载的实例(可以扩充本实例实现:对用户隐藏他要下载文件的路径,或者在下载文件时要做一些其他的工作,如检查用户有没有下载此文件的权限等)了解在Servlet中如何控制输出流以及response对象的contentType相关知识一个Servlet文件DownloadFile,在此Servlet中读取要下载的文件,然后写到响应流中以达到用户下载文件的目的。要下载的文件可以放在任何地方,并且是对用户隐藏的。在DownloadFile Servlet中,首先要得到要下载文件的文件名filename,同时要预先定义好文件保存的路径,然后设置response对象的内容类型和头信息,最后读取要下载文件的字节流并写到response的输出流中。

 
 
[java]  view plain copy
  1.   
[java]  view plain copy
  1. package myservlet;  
  2.   
  3.   
  4. import java.io.*;  
  5.   
  6. import javax.servlet.*;  
  7.   
  8. import javax.servlet.http.*;  
  9.   
  10.   
  11.   
  12. public class DownloadFile extends HttpServlet {  
  13.   
  14.  //字符编码  
  15.   
  16.  private final String ENCODING="GB2312";  
  17.   
  18.   
  19.  //内容类型  
  20.   
  21.  private final String CONTENT_TYPE="text/html;charset=gb2312";  
  22.   
  23.   
  24.  //要下载的文件存放的路径  
  25.   
  26.  private String downloadfiledir="d:\\temp\\";  
  27.   
  28.   
  29.   
  30.  public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{  
  31.   
  32.  //设置request对象的字符编码  
  33.   
  34.  request.setCharacterEncoding(ENCODING);  
  35.   
  36.   
  37.  //从request中取出要下载文件的名字  
  38.   
  39.  String filename=request.getParameter("filename");  
  40.   
  41.  if(filename==null||filename.trim().equals("")){  
  42.   
  43.  //设置response对象的ContentType  
  44.   
  45.  response.setContentType(CONTENT_TYPE);  
  46.   
  47.   
  48.  //输出错误信息  
  49.   
  50.  PrintWriter out=response.getWriter();  
  51.   
  52.  out.println("<font color=red>输入的文件名无效!</font>");  
  53.   
  54.  out.close();  
  55.   
  56.  }else{  
  57.   
  58.  //下载文件的完整路径名  
  59.   
  60.  String fullfilename=downloadfiledir+filename;  
  61.   
  62.  System.out.println("下载文件:"+fullfilename);  
  63.   
  64.   
  65.  //根据文件的类型设置response对象的ContentType  
  66.   
  67.  String contentType=getServletContext().getMimeType(fullfilename);  
  68.   
  69.  if(contentType==null)  
  70.   
  71.  contentType="application/octet-stream";  
  72.   
  73.  response.setContentType(contentType);  
  74.   
  75.   
  76.  //设置response的头信息  
  77.   
  78.  response.setHeader("Content-disposition","attachment;filename=\""+filename+"\"");  
  79.   
  80.  InputStream is=null;  
  81.   
  82.  OutputStream os=null;  
  83.   
  84.   
  85.  try{  
  86.   
  87.  is=new BufferedInputStream(new FileInputStream(fullfilename));  
  88.   
  89.   
  90.  //定义输出字节流  
  91.   
  92.  ByteArrayOutputStream baos=new ByteArrayOutputStream();  
  93.   
  94.   
  95.  //定义response的输出流  
  96.   
  97.  os=new BufferedOutputStream(response.getOutputStream());  
  98.   
  99.   
  100.  //定义buffer  
  101.   
  102.  byte[] buffer=new byte[4*1024]; //4k Buffer  
  103.   
  104.  int read=0;  
  105.   
  106.   
  107.  //从文件中读入数据并写到输出字节流中  
  108.   
  109.  while((read=is.read(buffer))!=-1){  
  110.   
  111.  baos.write(buffer,0,read);  
  112.   
  113.  }  
  114.   
  115.   
  116.  //将输出字节流写到response的输出流中  
  117.   
  118.  os.write(baos.toByteArray());  
  119.   
  120.  }catch(IOException e){  
  121.   
  122.  e.printStackTrace();  
  123.   
  124.  }finally{  
  125.   
  126.  //关闭输出字节流和response输出流  
  127.   
  128.  os.close();  
  129.   
  130.  is.close();  
  131.   
  132.  }  
  133.   
  134.  }  
  135.   
  136.  }  
  137.   
  138.   
  139.  public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{  
  140.   
  141.  //调用doGet()方法  
  142.   
  143.  doGet(request,response);  
  144.   
  145.  }  
  146.   
  147. }  
  148. 别处Copy的