A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冰深 中级黑马   /  2012-11-21 19:44  /  1475 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 冰深 于 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必须在输出数据流之前,否则设置就失效了!!!我起初没在意,现在想想还是有这个讲究的啊!!

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
许庭洲 发表于 2012-11-21 20:39
值得学习ing!

我的技术和技术分都需要增长啊~~.....
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马