黑马程序员-关于Servlet的response实现下载中的一个问题

来源:互联网 发布:网络电影 知乎 编辑:程序博客网 时间:2024/05/16 17:27
  ------- android培训java培训、期待与您交流! ----------  
         在练习用servlet的response头实现文件下载的时候,我遇到过一个很奇怪的问题,我本想实现读取文件然后让客户端下载,结果却直接将我要下载的文件给显示在浏览器上了!!!
        我仔细分析了代码,感觉代码没有错,原来是这样写的:
  1.         public void doGet(HttpServletRequest request, HttpServletResponse response)
  2.                         throws ServletException, IOException {
  3.                 // 获取文件路径,注意中文路径,设置文件头一定要在写数据之前,否则会直接打到浏览器显示
  4.                 String path = this.getServletContext().getRealPath("/files/鹰啊ying.jpg");
  5.                 //获取文件名
  6.                 String filename=path.substring(path.lastIndexOf("\\")+1);

  7.                 //获取文件流
  8.                 InputStream in=new FileInputStream(path);
  9.                 OutputStream out=response.getOutputStream();
  10.                 int len=0;
  11.                 byte [] buf=new byte[1024];
  12.                 while((len=in.read(buf))!=-1){
  13.                         out.write(buf,0,len);
  14.                 }        
  15.                 //设置文件头
  16. response.setHeader("Content-type", "image/jpeg");
  17. response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
  18.                 in.close();
  19.                 System.out.println("文件名是:"+filename);

  20.         }
复制代码
后来改成下面的就OK了!!!


  1.         public void doGet(HttpServletRequest request, HttpServletResponse response)
  2.                         throws ServletException, IOException {
  3.                 
  4.         
  5.                 // 获取文件路径,注意中文路径,设置文件头一定要在写数据之前,否则会直接打到浏览器显示
  6.                 String path = this.getServletContext().getRealPath("/files/鹰啊ying.jpg");
  7.                 //获取文件名
  8.                 String filename=path.substring(path.lastIndexOf("\\")+1);
  9.                 //设置文件头
  10.                 response.setHeader("Content-type", "image/jpeg");
  11.                 response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
  12.                 //获取文件流
  13.                 InputStream in=new FileInputStream(path);
  14.                 OutputStream out=response.getOutputStream();
  15.                 int len=0;
  16.                 byte [] buf=new byte[1024];
  17.                 while((len=in.read(buf))!=-1){
  18.                         out.write(buf,0,len);
  19.                 }        
  20.                 
  21.                 in.close();
  22.                 System.out.println("文件名是:"+filename);

  23.         }
复制代码
      原来是header的设置顺序问题,设置header必须在输出数据流之前,否则设置就失效了!!!我起初没在意,现在想想还是有这个讲究的啊!!