Php 如何在IE上下载csv文件?在firefox上工作

Php 如何在IE上下载csv文件?在firefox上工作,php,csv,download,internet-explorer,Php,Csv,Download,Internet Explorer,我正在与一个奇怪的错误作斗争。我有一个简单的web应用程序,它从数据库中获取内容,然后将其输出为可下载的csv文件。它可以在firefox和chrome上运行,但IE无法将其识别为csv文件(认为它是html fle),当我单击“保存”时,会出现错误,“无法从{name of site}下载{name of file}。无法打开此internet站点…” 代码: session_start(); //some logic goes here... //generate csv heade

我正在与一个奇怪的错误作斗争。我有一个简单的web应用程序,它从数据库中获取内容,然后将其输出为可下载的csv文件。它可以在firefox和chrome上运行,但IE无法将其识别为csv文件(认为它是html fle),当我单击“保存”时,会出现错误,“无法从{name of site}下载{name of file}。无法打开此internet站点…”

代码:

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 btw


更新2:连接通过SSL。

您是否尝试了内容类型:text/csv?

我们不喜欢IE吗?:)

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));
尝试使用以下标题:

  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下载文件。

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


由于应用程序/八位字节流是一种通用的二进制mime类型(与“.csv”扩展名不匹配),Internet explorer可能会忽略它,并根据文件扩展名计算mime类型

不久前,当安装AdobeReader 6.0并试图在浏览器窗口中打开文件时,IE6打开pdf文件时出现问题,并崩溃。我在这个标题的某个地方找到了:

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

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

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

header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=File.csv");
在我的例子中,将类型设置为application/vnd.ms-excel似乎可以做到这一点。这都在一个文件中,该文件通过使用提交表单打开

target="_blank"

我们最近自己也遇到了这个问题。看到这个了吗

这些是我们最终不得不使用的头文件,以使其通过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));

为了让IE使用SSL,我必须添加的唯一额外代码是:
header(“Pragma:public”)
因此,我的标题现在如下所示:

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

这根本没有道理。我尝试了被接受的答案,所有其他的答案都在这里,但它对我不起作用。我尝试了他们的排列方式,但不知何故,我成功地在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();

我做的一件事就是每次测试代码时清空缓存。这仍然没有意义。以防万一,有人可能会非常需要它;)

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

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

效果很好。

我的解决方案是:

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

如果您正试图使用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>

然后,
application/octet-stream
contentType
——对IE8执行
text/csv
失败

使用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();
关于更多信息,我已经写了关于这个的教程, 见-


希望这对您有所帮助。

您还尝试了哪些其他内容类型?我通常使用
text/csv
我本来就有这个,没有乐趣。我发现FF 3.6和IE 8的最小头是:头(“缓存控制:必须重新验证,后检查=0,预检查=0”);标题(“内容类型:应用程序/八位字节流”);标题(“内容处置:附件;文件名=\”.$filename.\”);哦,是的,我很喜欢itAh,扔掉一个旧的Excel插件,在你的下载中滚动你自己的CSV创建者-IE8 barfs。谢谢:]标题(“Pragma:public”);使用ssl对我也很有效。谢谢,我认为应该是“application/vnd.msexcel”。带有“L”的excel取决于最终用户平台,“内容类型:application/vnd.ms exe”在Mac和Linux客户端上不起作用。只要你的页面访问者都运行Windows,你就可以了。尝试了其中的几种和各种组合。使用RegEdit成功了。谢谢多个缓存控制头不是只发送第二个头吗?