Web的文件下载
下载文件需要设置response的俩个响应头及输出流
* 两个头一个流
* 1. Content-Type:设置下载资源类型(MIME类型)
* 2. Content-Disposition:下载框及下载文件名
* 3. 流:下载文件的数据,文件流
准备工作:需要导入 commons-io.jar包
为了解决下载框弹出文件名的乱码问题,一般需要导入如下方法:
// 用来对下载的文件名称进行编码的!
public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
String agent = request.getHeader("User-Agent"); //获取浏览器
if (agent.contains("Firefox")) {
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8"))
+ "?=";
} else if(agent.contains("MSIE")) {
filename = URLEncoder.encode(filename, "utf-8");
} else {
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
文件下载的具体步骤设置:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
/*
* 两个头一个流
* 1. Content-Type:下载资源类型
* 2. Content-Disposition:下载框及下载文件名
* 3. 流:下载文件的数据,文件流
*/
String filename = "D:/音乐/韩红-天路.mp3";
// 为了使下载框中下载文件名显示中文文件名称不出乱码!
String framename = filenameEncoding("流光%飞舞.mp3", request);
//通过文件名称获取MIME类型
String contentType = this.getServletContext().getMimeType(filename);
//设置下载框
String contentDisposition = "attachment;filename=" + framename;
// 文件流
FileInputStream input = new FileInputStream(filename);
//设置头
response.setHeader("Content-Type", contentType);
response.setHeader("Content-Disposition", contentDisposition);
// 获取绑定了响应端的流
ServletOutputStream output = response.getOutputStream();
IOUtils.copy(input, output);//把输入流中的数据写入到输出流中。
input.close();
}