servlet实现下载时,如果客户端安装了迅雷,发现不能正确下载。查找原因后发现是http头设置的问题,如文件类型CONTEN-TYPE、文件长度CONTEN-LENGTH。
具体解决如下:
response.setHeader("Content-Disposition", "attachment;filename=" + browName);
response.setContentLength(fileSize);
response.setContentType(contentType);
byte[] fileByte = new byte[1024];
while (fileInputStream.read(fileByte) > 0){
out.write(fileByte, 0, fileByte.length);
}
out.flush();
out.close();
out = null;
其中,
response.setContentLength(fileSize);
response.setContentType(contentType);
两句是关键。
另外,如果不想使用讯雷监控附件下载,可以取消讯雷对IE的监控。方法如下图所示

========================================
关于下载中文文件名的问题,不同浏览器需要使用不同的编码,下载前要在Java中进行文件名编码,实现如下:
private static String encodeFileName(HttpServletRequest req, String name)
throws UnsupportedEncodingException {
String agent = req.getHeader("USER-AGENT").toLowerCase();
if (agent != null
&& agent.indexOf("firefox") < 0
&& agent.indexOf("safari") < 0) {
return URLEncoder.encode(name, "UTF8");
}
return new String(name.getBytes("UTF-8"), "ISO8859-1");
}
在多数浏览器中使用 UTF8 ,而在 firefox 和 safari 中使用 ISO8859-1 。经测试在 IE、Firefox、Chorme、Safari、Opera 上都能正常显示中文文件名(只测试了较新的浏览器)。
本文介绍如何使用Servlet实现文件下载,并确保文件名在不同浏览器中正确显示中文。重点在于HTTP头设置,包括CONTENT-TYPE和CONTENT-LENGTH,以及针对不同浏览器的文件名编码方法。
369

被折叠的 条评论
为什么被折叠?



