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 上都能正常显示中文文件名(只测试了较新的浏览器)。