2010-02-09 83 views
34

我正在为一个奇怪的错误而苦苦挣扎。我有一个简单的Web应用程序,可以从数据库中获取内容,然后将其输出为可下载的csv文件。它适用于Firefox和Chrome浏览器,但IE浏览器无法识别它为csv文件(认为它是一个html文件),当我点击保存时出现错误,“无法从{站点名称}下载{文件名} 。无法打开此互联网网站......”如何在IE上下载csv文件? Works on firefox

代码:

session_start(); 

//some logic goes here... 

//generate csv header 
header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=exportevent.csv"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 

echo "Event: " . $event_title . "\n"; 

//print the column names 
echo "Last Name, First Name, Company \n"; 

while($row = mysql_fetch_assoc($result)) 
{ 
    echo $row['atlname'] . ',' . $row['atfname'] . ',' . $row['atcompany'] . "\n";  
} 

我已经与内容类型一大堆玩耍了,但没有任何效果。

更新:我已经尝试过text/csv,application/vnd.ms-excel(和这个变体),text/plain,还有一些我现在忘记没有运气的人。

这是IE8顺便说一句。

更新2:连接是通过SSL。

+2

您尝试了其他什么内容类型?我通常使用'文本/ csv' – prodigitalson 2010-02-09 20:00:00

回答

56

难道我们不喜欢IE吗? :)

尝试使用这些头:

header("Pragma: public"); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false); 
    header("Content-Type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename=\"exportevent.csv\";"); 
    header("Content-Transfer-Encoding: binary"); 

我认为八位字节流内容类型强制IE下载文件。

+2

我发现对于FF 3.6和IE 8的最小报头是:标题(“缓存控制:必重新验证,后检查= 0,预检查= 0”);头(“Content-type:application/octet-stream”); header(“Content-Disposition:attachment; filename = \”“。$ filename。”\“”); – Ben 2010-10-15 07:38:23

+5

哦,是IE我爱它 2011-01-28 04:24:49

+0

啊,扔掉旧的Excel插件,并推出自己的CSV创造者 - IE8 barfs在你的下载。谢谢:] – phatskat 2012-09-19 05:48:28

-1

你尝试的内容类型:文本/ CSV?

1

尝试将您的内容类型设置为text/csv而不是application/octet-stream

由于application/octet-stream是一个通用的二进制MIME类型(并且与'.csv'扩展名不匹配),Internet Explorer可能会忽略它并根据文件扩展名计算MIME类型。

+0

我原本是这样的,没有快乐。 – 2010-02-09 22:03:11

-1

前段时间我用IE6打开pdf文件时出现问题,并且在安装AdobeReader 6.0并试图在浏览器窗口中打开文件时崩溃。比我找到这个标头的地方:

header('Content-Type: application/force-download'); 

它解决了这个问题,每个PDF文件都下载并在Adobe而不是IE打开。

4

我已经受够了以下成功:

header("Content-type: application/vnd.ms-excel"); 
header("Content-disposition: attachment; filename=File.csv"); 

设置类型为application/vnd.ms - Excel中似乎这样的伎俩在我的情况。这是所有通过提交表单打开的文件

target="_blank" 
6

我们最近自己遇到了这个问题。看到这MSKB article

这些是我们最终不得不使用它来通过SSL工作的标头。

header("Expires: Sat, 01 Jan 2000 00:00:00 GMT"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public"); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"$file_name\";"); 
header("Content-length: " . strlen($csv_string)); 
+0

尝试了几种这些和各种组合。使用RegEdit做了诀窍。谢谢! – marklark 2011-08-23 21:06:07

+0

多个Cache-Control标题是否仅导致发送第二个标头? – Ross 2015-02-18 03:05:25

4

唯一额外的代码,我不得不增加对IE浏览器使用SSL是:header("Pragma: public"); 所以我的头看起来像现在这样:

header("Pragma: public"); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=some_filename.csv"); 
+0

header(“Pragma:public”);对于我来说ssl也很好。谢谢 – 2011-06-21 14:48:56

-1

这根本没有意义。我尝试了接受的答案,所有其他的答案在这里,并没有为我工作。我想他们的排列,并以某种方式我设法使它在IE浏览器,像这样:

header("Pragma: public"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public"); 
header("Content-Type: application/vnd.ms-exce"); 
header("Content-Disposition: attachment; filename=coupons.csv"); 
header("Content-Transfer-Encoding: binary");  
header("Content-Length: " . strlen($csv)); 
echo $csv; 
die(); 

有一件事我所做的是清空缓存每次再用一次我对代码进行测试。它仍然没有意义。以防万一有人可能会需要这个拼命;)

+0

我认为它应该是“application/vnd.ms-excel”。与“L” – Dave 2011-08-15 17:55:11

+0

根据最终用户平台“内容类型:应用程序/ vnd.ms-EXCE”关于Excel将无法在Mac和Linux客户端。只要你的页面访问者都运行Windows,你就可以。 – 2012-09-21 14:07:00

2

我们刚刚有同样的问题,并增加了许多头部和得到一个工作环节后,我取出,然后逐一和发现的关键之一我们的是 “的cache控制:公众” 所以最终我们刚刚

header("Cache-Control: public"); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=some_filename.csv"); 

它工作得很好。

+0

你刚刚为我节省了几个小时的工作!非常感谢! – toon81 2012-01-13 16:37:52

0

对我来说,解决办法是:

header_remove(); 
header('Content-Type: text/csv'); 
header('Content-Disposition: attachment; filename=brokerlist.csv'); 
echo $content; 
-2

如果你正在尝试完成使用Salesforce.com这个任务(获得一个CSV文件中的IE8下载)(在这种情况下,您的前置式到底是Visualforce,你不能设置所有的头,只有一些),这里就是你需要:

<apex:page cache="true" 
     contentType="application/octet-stream#myAwesomeFileName.csv" 
     showHeader="false" sidebar="false" standardStylesheets="false"> 
    <apex:outputText value="{!csvContent}" escape="false"/> 
</apex:page> 

钥匙碎片这里cache=true,其中,在CON使用默认expires=0属性结,达到以下标题:

header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public"); 

然后的application/octet-streamcontentType ---做text/csv失败了IE8。

-1

使用Javascript后,它将解决您的问题。

用这个IE,

var IEwindow = window.open(); 
    IEwindow.document.write('sep=,\r\n' + CSV); 
    IEwindow.document.close(); 
    IEwindow.document.execCommand('SaveAs', true, fileName + ".csv"); 
    IEwindow.close(); 

欲了解更多信息,我已经写上教程, 看看 - Download JSON data in CSV format Cross Browser Support

希望这将是对你有帮助。