我试图让用户下载带有日文名称的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));
答案 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)中运行。另外,我不必编写任何特定于浏览器的代码。
所有浏览器都会尝试从路径中获取文件名 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 );