黑马程序员技术交流社区

标题: 关于Servlet的response实现下载中的一个问题 [打印本页]

作者: 冰深    时间: 2012-11-21 19:44
标题: 关于Servlet的response实现下载中的一个问题
本帖最后由 冰深 于 2012-11-21 19:45 编辑

         在练习用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.         }
复制代码

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

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

作者: 许庭洲    时间: 2012-11-21 20:39
值得学习ing!
作者: 冰深    时间: 2012-11-21 22:32
许庭洲 发表于 2012-11-21 20:39
值得学习ing!

我的技术和技术分都需要增长啊~~.....




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2