黑马程序员技术交流社区
标题:
关于Servlet的response实现下载中的一个问题
[打印本页]
作者:
冰深
时间:
2012-11-21 19:44
标题:
关于Servlet的response实现下载中的一个问题
本帖最后由 冰深 于 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必须在输出数据流之前,否则设置就失效了!!!我起初没在意,现在想想还是有这个讲究的啊!!
作者:
许庭洲
时间:
2012-11-21 20:39
值得学习ing!
作者:
冰深
时间:
2012-11-21 22:32
许庭洲 发表于 2012-11-21 20:39
值得学习ing!
我的技术和技术分都需要增长啊~~.....
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2