UTF-8编码已下载文件中的名称

时间:2013-08-05 04:44:54

标签: java encoding utf-8

我试图让用户下载带有日文名称的excel文件。它似乎只适用于IE 8和其他IE和Firefox,它不起作用。请建议我如何处理这个问题。

String fileName = dateString+"_マイページ情報.xls";
byte[] data = writer.getData();
response.setContentType("application/ms-excel");
response.setContentLength(data.length);
response.setHeader("Expires:", "0"); // eliminates browser caching
response.setHeader("Content-Disposition","attachment; filename="+URLEncoder.encode(fileName));

6 个答案:

答案 0 :(得分:37)

我解决了以下问题。

fileName = dateString+"_マイページ情報.xls"; 
fileName = URLEncoder.encode(fileName,"UTF-8"); 
try {
        response.setContentType("application/ms-excel; charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        if(browserType.equals("IE")||browserType.equals("Chrome"))
            response.setHeader("Content-Disposition","attachment; filename="+fileName);
        if(browserType.endsWith("Firefox"))
            response.setHeader("Content-Disposition","attachment; filename*=UTF-8''"+fileName);
    } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

答案 1 :(得分:9)

使用方法setCharacterEncoding

  

设置要发送的响应的字符编码(MIME字符集)   例如,客户端到UTF-8。如果字符编码有   已经由setContentType(java.lang.String)或设置   setLocale(java.util.Locale),此方法会覆盖它。调用   setContentType(java.lang.String),带有text / html和   使用UTF-8字符串调用此方法与   使用text / html的String调用setContentType;字符集= UTF-8。

     

可以重复调用此方法以更改字符编码。   如果在getWriter之后调用它,则此方法无效   在响应被提交之后或之后。

使用以下代码修改您的代码:

response.setContentType("application/ms-excel; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition","attachment; filename="+URLEncoder.encode(fileName, "UTF-8"));

答案 2 :(得分:5)

在URLEncoder调用中,传递第二个可选参数" UTF-8"。 见http://docs.oracle.com/javase/1.4.2/docs/api/java/net/URLEncoder.html#encode(java.lang.String,%20java.lang.String)

答案 3 :(得分:2)

这就是我的工作,它可以在我尝试过的 ALL 浏览器(Chrome,Firefox和Safari)中运行。另外,我不必编写任何特定于浏览器的代码。

根据此链接:http://blogs.msdn.com/b/ieinternals/archive/2010/06/07/content-disposition-attachment-and-international-unicode-characters.aspx

  

所有浏览器都会尝试从路径中获取文件名   URL的组成部分

因此,如果浏览器请求一个以文件名结尾的URL,它将正确命名该文件。对于所有浏览器来说似乎都是如此。

就我个人而言,客户端不知道要下载的文件名。我们的系统基于ID对文件进行GET。例如:

/api/file/download/<file_id>

所以,我要做的是让该API查找文件名(我们通过file_id将其存储在db中),对其进行URL编码并重定向到第二个包含文件名。例如:

/api/file/download/<file_id>/<url-encoded filename>

然后,第二个API将使用file_id查找并流回文件的内容,浏览器将使用filename部分来命名下载的文件。

注意:第二个API会忽略文件名(不需要)。还将Content-Disposition标头设置为“附件”;仅(不要设置文件名。让浏览器从URL中获取文件名。)

答案 4 :(得分:1)

以下工作正常。

String fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition","attachment; filename="+fileName );

答案 5 :(得分:-1)

  

无需设置setCharacterEncoding,只需添加以下行即可   它的工作正常。

String fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition","attachment; filename="+fileName );