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的解决方案。

我看到两件事:

  1. Content-Dispositionfilename=之后不应该有空格。
  2. 我从来没有在文件名周围使用过引号; 我不认为你的意思。 我没有看到任何关于在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(); 

它可能会工作。