本帖最后由 冰深 于 2012-11-21 19:45 编辑
在练习用servlet的response头实现文件下载的时候,我遇到过一个很奇怪的问题,我本想实现读取文件然后让客户端下载,结果却直接将我要下载的文件给显示在浏览器上了!!!
我仔细分析了代码,感觉代码没有错,原来是这样写的:- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- // 获取文件路径,注意中文路径,设置文件头一定要在写数据之前,否则会直接打到浏览器显示
- String path = this.getServletContext().getRealPath("/files/鹰啊ying.jpg");
- //获取文件名
- String filename=path.substring(path.lastIndexOf("\\")+1);
- //获取文件流
- InputStream in=new FileInputStream(path);
- OutputStream out=response.getOutputStream();
- int len=0;
- byte [] buf=new byte[1024];
- while((len=in.read(buf))!=-1){
- out.write(buf,0,len);
- }
- //设置文件头
- response.setHeader("Content-type", "image/jpeg");
- response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
- in.close();
- System.out.println("文件名是:"+filename);
- }
复制代码
- 【【【【【【【【【【【后来我改成这样就正常了!】】】】】】】】】】】】
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
-
-
- // 获取文件路径,注意中文路径,设置文件头一定要在写数据之前,否则会直接打到浏览器显示
- String path = this.getServletContext().getRealPath("/files/鹰啊ying.jpg");
- //获取文件名
- String filename=path.substring(path.lastIndexOf("\\")+1);
- //设置文件头
- response.setHeader("Content-type", "image/jpeg");
- response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));
- //获取文件流
- InputStream in=new FileInputStream(path);
- OutputStream out=response.getOutputStream();
- int len=0;
- byte [] buf=new byte[1024];
- while((len=in.read(buf))!=-1){
- out.write(buf,0,len);
- }
-
- in.close();
- System.out.println("文件名是:"+filename);
- }
复制代码 原来是header的设置顺序问题,设置header必须在输出数据流之前,否则设置就失效了!!!我起初没在意,现在想想还是有这个讲究的啊!!
|