你的位置:首页 > Java教程

[Java教程]文件下载(下载文件名乱码解决方法)


1. 下载就是向客户端响应字节数据!
原来我们响应的都是html的字符数据!
把一个文件变成字节数组,使用response.getOutputStream()来各应给浏览器!!!

2. 下载的要求
* 两个头一个流!
> Content-Type:你传递给客户端的文件是什么MIME类型,例如:image/pjpeg
* 通过文件名称调用ServletContext的getMimeType()方法,得到MIME类型!
> Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx
* 在filename=后面跟随的是显示在下载框中的文件名称!
> 流:要下载的文件数据!
* 自己new一个输入流即可!
3、下载的细节
显示在下载框中的中文名称时,会出现乱码。
* FireFox:Base64编码。
* 其他大部分浏览器:URL编码。
通用方案:
 1  public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException { 2   String agent = request.getHeader("User-Agent"); //获取浏览器 3   if (agent.contains("Firefox")) { 4    BASE64Encoder base64Encoder = new BASE64Encoder(); 5    filename = "=?utf-8?B?" 6      + base64Encoder.encode(filename.getBytes("utf-8")) 7      + "?="; 8   } else if(agent.contains("MSIE")) { 9    filename = URLEncoder.encode(filename, "utf-8");10   } else {11    filename = URLEncoder.encode(filename, "utf-8");12   }13   return filename;14  }

4、演示:

 1 package web.servlet; 2 3 import org.apache.commons.io.IOUtils; 4 import sun.misc.BASE64Encoder; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.ServletOutputStream; 8 import javax.servlet.annotation.WebServlet; 9 import javax.servlet.http.HttpServlet;10 import javax.servlet.http.HttpServletRequest;11 import javax.servlet.http.HttpServletResponse;12 import java.io.FileInputStream;13 import java.io.IOException;14 import java.net.URLEncoder;15 16 @WebServlet(name = "Download1Servlet",urlPatterns = "/Download1Servlet")17 public class Download1Servlet extends HttpServlet {18  public void doGet(HttpServletRequest request, HttpServletResponse response)19    throws ServletException, IOException {20   /*21   * 两个头一个流22   * 1、Content-Type23   * 2、Content-Disposition24   * 3、流:下载文件的数据25   * */26   String filename = "/Users/Shared/薛之谦-一半.mp3";27   String framename = filenameEncoding("薛之谦-一半.mp3",request);28   String contentType = this.getServletContext()29     .getMimeType(filename);//通过文件名获取MIME类型30   String contentDisposition = "attachment;filename="+framename;31   //一个流32   FileInputStream input = new FileInputStream("/Users/Shared/薛之谦-一半.mp3");33   //设置头34   response.setHeader("content-Type",contentType);35   response.setHeader("content-Disposition",contentDisposition);36   //获取绑定了响应端的流37   ServletOutputStream output = response.getOutputStream();38   IOUtils.copy(input,output);//把输出流中的数据写入到输出流中39   input.close();40  }41  public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {42   String agent = request.getHeader("User-Agent"); //获取浏览器43   if (agent.contains("Firefox")) {44    BASE64Encoder base64Encoder = new BASE64Encoder();45    filename = "=?utf-8?B?"46      + base64Encoder.encode(filename.getBytes("utf-8"))47      + "?=";48   } else if(agent.contains("MSIE")) {49    filename = URLEncoder.encode(filename, "utf-8");50   } else {51    filename = URLEncoder.encode(filename, "utf-8");52   }53   return filename;54  }55 }