如何在IE上下载csv文件?适用于Firefox

时间:2010-02-09 19:55:46

标签: php csv download internet-explorer

我正在努力解决一个奇怪的错误。我有一个简单的Web应用程序,从数据库中抓取东西,然后将其输出为可下载的csv文件。它适用于firefox和chrome,但IE无法将其识别为csv文件(认为它是一个html文件),当我点击保存时,我收到错误,“无法从{site of site}下载{name of file} 。无法打开这个网站....“

代码:

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。

12 个答案:

答案 0 :(得分: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下载文件。

答案 1 :(得分: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));

答案 2 :(得分:4)

我在以下方面取得了成功:

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

将类型设置为application / vnd.ms-excel似乎可以解决这个问题。这都是通过使用

提交表单打开的文件
target="_blank"

答案 3 :(得分:4)

我必须为IE使用SSL添加的唯一额外代码是:header("Pragma: public"); 所以我的标题现在看起来像这样:

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

答案 4 :(得分:2)

我们刚刚遇到了同样的问题,在添加了许多标题并获得了工作链接后,我逐个删除了它们,发现对我们来说关键是 “缓存控制:公共” 所以最后我们只是

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

工作得很好。

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

我的解决方案是:

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

答案 7 :(得分:-1)

您是否尝试过Content-type:text / csv?

答案 8 :(得分:-1)

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

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

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

答案 9 :(得分:-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();

我做的一件事就是在每次测试代码时都清空缓存。它仍然没有意义。以防有人可能迫切需要这个;)

答案 10 :(得分:-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

希望这会对你有所帮助。

答案 11 :(得分:-2)

如果您正在尝试完成此任务(在IE8中下载CSV文件) 使用Salesforce.com (在这种情况下,您的前端是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,它与默认的expires=0属性一起实现了以下标题:

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

然后contentType的{​​{1}} --- application/octet-stream对IE8失败了。