如何使用CSV MIME类型?

128

我正在开发的Web应用中,用户可以单击链接下载CSV文件。该文件的MIME类型未设置头信息,因此浏览器将其呈现为文本。我希望以.csv文件格式发送该文件,以便用户可以直接使用calc、excel、gnumeric等软件打开。

header('Content-Type: text/csv');
echo "cell 1, cell 2";

这段代码在我的电脑上按预期工作(这不是常态吗?),但在另一台电脑上无法正常运行。

我的浏览器是 Linux 上的 Firefox 3.0.1 的最新版。它不能在 Windows 上的 IE 7 和 Firefox 3.0 中正常工作。

我是否存在未意识到的问题?

5个回答

226

您可以尝试通过以下方式强制浏览器打开“另存为”对话框:

header('Content-type: text/csv');
header('Content-disposition: attachment;filename=MyVerySpecial.csv');
echo "cell 1, cell 2";

这应该可以在大多数主流浏览器上使用。


12

你没有指定语言或框架,但以下标题用于文件下载:

"Content-Disposition: attachment; filename=abc.csv"

5
使用Internet Explorer下载时,通常需要同时指定Pragma: public头才能使下载功能正常运行。
header('Pragma: public');

只是我的个人意见。。

5
"Pragma: public" 对于Internet Explorer来说毫无意义。(我曾经参与过相关组件的开发,并且通过查找源代码确认了这一点)。 - EricLaw
可能的实用性是替换现有的Pragma: no-cache头吗? - Doin

2

这段代码可以用来导出任何文件,包括csv格式的文件。

// application/octet-stream tells the browser not to try to interpret the file
header('Content-type: application/octet-stream');
header('Content-Length: ' . filesize($data));
header('Content-Disposition: attachment; filename="export.csv"');

2
"octetstream" 的意思是 "octet-stream"。 - EricLaw
2
这可能会在某些浏览器中引起警告:资源被解释为文档,但使用 MIME 类型 application/octet-stream 进行传输。 - mikeschuld

0

我尝试使用text/csv,但是它对我没有起作用,然后我尝试了不同的东西,发现如果我们使用text/plain,那么文件上传就会像预期的那样完成。这个问题出现在Yii2文件上传小部件中。

成功后的示例响应。

{"files":[{"name":"unit_ids list - Sheet1.csv","type":"text/plain","size":30,"base_url":"https://s3-eu-west-1.amazonaws.com/cdn.abc.co","path":"1/g2qVy3JtyZBLaRUd8c5gMOtSyrTEwdzR.csv","url":"https://s3-eu-west-1.amazonaws.com/cdn.abc.co/1/g2qVy3JtyZBLaRUd8c5gMOtSyrTEwdzR.csv","delete_url":"/coupons/default/sheet-delete?path=1%2Fg2qVy3JtyZBLaRUd8c5gMOtSyrTEwdzR.csv"}]}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接