从网上看到了好多关于文件下载的问题,我之前也遇到过。比如在ff/chrome/360都好用,但在ie下乱码。或者中文转码后中文部门丢失等。今天整理下文件下载的问题,亲测ie,ff,chrome,360都能显示中文名,并且支持图片、office等通用文件的下载,下面附上代码
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.activation.MimetypesFileTypeMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Encoder;
public static void downloadFile(String filename, String filePath,
HttpServletRequest request, HttpServletResponse response) {
try {
// 1.得到下载文件的名称.必须处理乱码.
filename = new String(filename.getBytes("iso8859-1"), "utf-8");
// 2.从upload目录下查找filename文件是否存在。
File file = new File(filePath);
// 下载设置
// 1.设置mimetype类型
String mimeType = new MimetypesFileTypeMap().getContentType(file);
response.setContentType(mimeType); // 根据文件名获取这种文件的mimeType值,设置到http响应头中。
// 以下代码解决了浏览器显示下载文件名乱码问题
String agent = request.getHeader("User-agent");
String viewfilename = null;
if (agent.contains("MSIE")) {
// IE浏览器
viewfilename = URLEncoder.encode(filename, "utf-8");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
viewfilename = "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else if (agent.contains("Chrome")) {
// google浏览器
viewfilename = URLEncoder.encode(filename, "utf-8");
} else {
// 其它浏览器
viewfilename = URLEncoder.encode(filename, "utf-8");
}
// 2.设置响应头 Content-Dispositon.
response.setHeader("Content-Disposition", "attachment;filename="
+ viewfilename);
if (file.exists()) {
// 存在
// 3.通过输入流将这个文件内容读取出来,通过response获取输出流,写回到浏览器.
FileInputStream fis = new FileInputStream(file);
OutputStream os = response.getOutputStream();
int len = -1;
byte[] b = new byte[1024];
while ((len = fis.read(b)) != -1) {
os.write(b, 0, len);
os.flush();
}
try {
fis.close();
os.close();
}
catch (IOException e1) {
e1.printStackTrace();
}
} else {
// 不存在
throw new RuntimeException("下载资源不存在");
}
}
catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException("下载资源名称转码异常");
}
catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException("下载资源不存在");
}
catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("下载资源流异常");
}
}