文件下载,content-disposition 中文乱码

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

2、下载的要求
两个头一个流

Content-Type:你传递给客户端的文件是什么MIME类型,例如:image/jpeg
通过文件名称调用servletContext的getMimeType()方法,得到MIME类型
String filePath = “D:\时间都去哪儿了.mp3”;
String contentType = this.getServletContext().getMimeType(filePath);
response.setCharacterEncoding(“UTF-8”);
response.setContentType(contentType);
Content-Disposition:它的默认值是inline,表示在浏览器窗口打开,attachment;filename=xxx,浏览器跳出下载框
在filename=后面跟随的是显示在下载框中的文件名称
String contentDisposition = “attachment;filename=”+URLEncoder.encode(“时间都去哪儿了.mp3”, “UTF-8”);
response.setHeader(“Content-Disposition”, contentDisposition);
流:要下载的文件数据。
自己new一个输入流即可!
FileInputStream is = new FileInputStream(filePath);

    ServletOutputStream os = response.getOutputStream();
    IOUtils.copy(is, os);
    is.close();

源码:

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String filePath = "D:\\时间都去哪儿了.mp3";
        String contentType = this.getServletContext().getMimeType(filePath);
        System.out.println(contentType);
        String contentDisposition = "attachment;filename*=UTF-8''"+URLEncoder.encode("时间都去哪儿了.mp3", "UTF-8");
        FileInputStream is = new FileInputStream(filePath);

        response.setCharacterEncoding("UTF-8");
        response.setContentType(contentType);
        //response.setHeader("content-Type", contentType);
        response.setHeader("Content-Disposition", contentDisposition);

        ServletOutputStream os = response.getOutputStream();
        IOUtils.copy(is, os);
        is.close();

    }

3、中文名乱码问题
3.1、使用指定编码,并告诉浏览器编码类型

Content-Disposition : attachment; filename* = UTF-8''%E6%96%87%E4%BB%B6.txt

向下兼容:
Content-Disposition: attachment;
filename=”encoded_text”;
filename*=utf-8”encoded_text

filename*=编码类型”使用编码类型来编码的文件名

String contentDisposition = "attachment;filename=" + URLEncoder.encode("时间都 去哪儿了.mp3", "UTF-8")
                + ";filename*=UTF-8''" + URLEncoder.encode("时间都去哪 儿了.mp3", "UTF-8");
//优先使用filename*=utf-8''encoded_text;没有这个或者这个解码出问题了,使用filename="encoded_text";

你可能感兴趣的:(MyEclipse,JavaWeb)