下载文件须要设置response的俩个响应头及输出流
* 两个头一个流
* 1. Content-Type:设置下载资源类型(MIME类型)
* 2. Content-Disposition:下载框及下载文件名
* 3. 流:下载文件的数据,文件流html
准备工做:须要导入 commons-io.jar包java
为了解决下载框弹出文件名的乱码问题,通常须要导入以下方法:浏览器
// 用来对下载的文件名称进行编码的! 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; }
文件下载的具体步骤设置:this
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(); }