30

我试图让用户下载带有日文名称的 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));
4

6 回答 6

45

我得到它解决如下。

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();
    }
于 2013-08-05T10:32:28.877 回答
12

使用方法setCharacterEncoding

设置发送到客户端的响应的字符编码(MIME 字符集),例如,UTF-8。如果字符编码已由 setContentType(java.lang.String) 或 setLocale(java.util.Locale) 设置,则此方法将覆盖它。用text/html的String调用setContentType(java.lang.String),用UTF-8的String调用这个方法,相当于用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"));
于 2013-08-05T04:50:35.100 回答
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)

于 2013-08-05T04:53:36.643 回答
3

这就是我所做的,它适用于我尝试过的所有浏览器(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 查找文件名(我们将其存储在 db 中,通过 file_id),对其进行 URL 编码,然后重定向到包含文件名的第二个 API。例如:

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

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

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

于 2018-08-07T16:34:18.567 回答
1

下面工作正常。

String fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition","attachment; filename="+fileName );
于 2018-11-14T06:18:07.810 回答
0

无需设置 setCharacterEncoding ,只需在下面添加即可正常工作。

String fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition","attachment; filename="+fileName );
于 2016-07-15T07:14:53.863 回答