Chrome会在下载的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=
之后不应该有空格。 - 我从来没有在文件名周围使用过引号; 我不认为你的意思。 我没有看到任何关于在RFC中使用引号的内容 ,所以我会删除它们。
我希望你看到一个连字符,因为Chrome正在用连字符替换空格或(更有可能)引号,因为它认为操作系统上文件名的引号无效字符。
FWIW,我工作的Content-Disposition
标题如下所示:
Content-Disposition:attachment; filename = someFileName.csv
偏离主题 :重申你的陈述:
我的代码适用于IE和FF。 在Chrome中,浏览器会在文件名的开头和结尾附加“ – ”,因此无法识别文件类型。
浏览器应该(并且大多数情况下)通过MIME类型识别文件类型,而不是文件扩展名。 您可能希望将Content-Type
设置为text/csv
而不是application/octet-stream
。 (当然,如果你正在谈论操作系统稍后对文件做了什么,那就是另一回事了。)
这是Chrome的错误/function。 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,stuff\n yeah, uhuh\n"; //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的文件名?
$response->sendHeaders(); $response->sendContent();
用以下单行代码替换上面两行。
$response->send();
它可能会工作。