必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-06-09 06:45:15来源:IT技术作者:seo实验室小编阅读:56次「手机版」
 

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";

相关阅读

header中Content-Disposition的作用

今天查看Struts2的文件上传部分 发现有个例子开头打印的信息中有Content-Disposition,一时好奇,所以了解了一下。顺便学习一下文件

分享到:

栏目导航

推荐阅读

热门阅读