JSP文件下载中文和空格显示Content-Disposition设置

       Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。当 Internet Explorer 接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。(请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。)  

       服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment:

      Response.setHeader("Content-Disposition","attachment;filename=FileName.txt");

    备注:这样浏览器会提示保存还是打开,即使选择打开,也会使用相关联的程序比如记事本打开,而不是IE直接打开了。

    另外原始的空格使用urlEncode 编码后转换为+号(基于历史原因),而ie解析时会直接作为+号处理,因此需要手工替换一下这个特殊字符 -->详细请看情况四

下面是各种响应头设置的情况演示:

情况一:(下载文件名为Download)

1.有文件扩展名

2.名字默认为Download

//得到要下载的文件名
        String fileName = request.getParameter("filename");
        System.out.println("fileName: " + fileName);
//设置响应头,控制浏览器下载该文件
        response.setHeader("content-disposition","attachment;filename=" + fileName);


情况二:(下载文件名为spring+-+副本+%284%29)

1.没有文件扩展名

2.不能正常显示符号

        //处理文件名
        int index = fileName.lastIndexOf(".");
        String realname = fileName.substring(0,index);
        System.out.println("realname : " + realname);

        //设置响应头,控制浏览器下载该文件
        response.setHeader("content-disposition", "attachment;filename="
                + URLEncoder.encode(realname, "UTF-8"));


情况三:(下载文件名为spring+-+副本+(2))

1.能正常显示符号

2.名字出现"+"

//设置响应头,控制浏览器下载该文件
        response.setHeader("content-disposition","attachment;filename*=UTF-8''" + URLEncoder.encode(fileName,"UTF-8"));



情况四:(下载文件名为spring - 副本 (3))

1.能正常显示符号

2.解决名字出现"+"问题

//设置响应头,控制浏览器下载该文件
        response.setHeader("content-disposition","attachment;filename*=UTF-8''" + URLEncoder.encode(fileName,"UTF-8").replaceAll("\\+", "%20"));      

ok!