下载文件无非就是IO流的读写操作,但写是向浏览器上写,所以用HttpServletResponse对象来获取输出流,并且设置响应头Content-Disposition。而IE与FireFox的默认不同编码,显示下载文件名出现乱码,所以先要判断是哪个浏览器,然后针对性的进行编码。
编写工具类,判断是什么浏览器
public class HttpUtils {
//对应不同版本的IE浏览器的一些关键字
private static String [] IEBrowserSignals = {"MSIE","Trident","Edge"};
public static boolean isIEBrowser(HttpServletRequest request){
String userAgent = request.getHeader("User-Agent");
for(String signal : IEBrowserSignals){
if(userAgent.contains(signal)){
return true;
}
}
return false;
}
}
编写主体
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
//获取文件的盘符路径
String path = getServletContext().getRealPath("/image/iso美女图片.jpg");
//获取filename
int index = path.lastIndexOf("\\");
String filename = path.substring(index+1);
//根据不同的浏览器对filename进行编码
boolean isIEBrowser = HttpUtils.isIEBrowser(request);
if(isIEBrowser){
filename = URLEncoder.encode(filename, "UTF-8");
}else{
filename = new String(filename.getBytes("UTF-8"),"ISO-8859-1");
}
//设置头信息,filename前后加引号是为了火狐浏览器中英同时出现不出错。
response.setHeader("Content-Disposition", "attachment;filename=\""+filename+"\"");
//获取io流,并频繁读写操作,结束后关闭流资源
InputStream in = new FileInputStream(path);
OutputStream out = response.getOutputStream();
byte [] buf = new byte[1024];
int len = 0;
while((len = in.read(buf))!=-1){
out.write(buf, 0, len);
}
in.close();
}