“到下载的CSV文件
我的代码适用于IE和FF。 在Chrome浏览器中,浏览器会在文件名的开始和结尾添加“ - ”连字符,因此无法识别文件类型。 重命名文件时保存为csv使它在Excel中打开在一个单元中,但我想要一个解决方案在代码中处理它。 这似乎很难。
以下是我的代码:
//fileName = xxxx.csv
response.setContentType("application/download");
response.setHeader("Cache-Control", "public");
response.setHeader("Content-Type", "application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename= "" + fileName + """);
注意:我搜索了很多博客,但没有找到Chrome的解决方案。
我看到两件事情:
Content-Disposition
,您不应该在filename=
后有空格。 我希望你会看到一个连字符,因为Chrome会使用连字符替换空格或(更可能)引号,因为它会在操作系统上考虑文件名的引号无效字符。
FWIW,我的工作Content-Disposition
标题如下所示:
Content-Disposition: attachment;filename=someFileName.csv
题外话 :重申你的观点:
我的代码适用于IE和FF。 在Chrome浏览器中,浏览器会在文件名称的开始和结尾附加“ - ”字样,因此无法识别文件类型。
浏览器应该(并且主要是)通过MIME类型识别文件类型,而不是文件扩展名。 您可能希望将Content-Type
设置为text/csv
而不是application/octet-stream
。 (当然,如果你在谈论操作系统在后面对文件做什么,那是另一回事。)
这是Chrome的一个缺陷/功能。 https://code.google.com/p/chromium/issues/detail?id=69939
看起来Chrome浏览器认为引用是文件名的一部分,但意识到它们是文件名的有效字符,因此将它们转换为连字符。
RFC2183定义了Content-Disposition标头,但没有说明如果服务器将文件名用引号括起来会发生什么。
http://www.ietf.org/rfc/rfc2183.txt(来自第1条评论)
您必须从Content-Disposition的文件名部分删除引号。 我不确定空白文件名中没有引号会发生什么情况。 这需要测试。
虽然无效字符可能会导致发生这种情况,但只能在与答案答案中列出的情况不同的情况下发生此后缀连字符文件名问题。
Long yesterday = new Date().getTime() - (1000*60*60*24);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String theCsv = "stuff,stuffn yeah, uhuhn";
//This sends a normal file
Attachment att = new Attachment("myfile.csv", theCsv.getBytes(), "UTF-8");
sendEmailWithAttachment("you@you.com","Me","me@me.com","Stuff for "+sdf.format(yesterday) ,"", att);
//This sends one with a trailing hyphen!!
String fileName = sdf.format(yesterday)+"-myfile.csv";
fileName = fileName.replaceAll(" ", "").replaceAll(""", "");
Attachment att = new Attachment( fileName, theCsv.getBytes(), "UTF-8");
sendEmailWithAttachment("you@you.com", "Me","me@me.com","Stuff for "+sdf.format(yesterday),"", att);
我无法解释这一点。 在我的情况下问题不是引号或空格 - 唯一的区别是预解析的文件名。 也许尝试没有字符串concats的文件名?
链接地址: http://www.djcxy.com/p/95089.html