Php 如何在IE上下载csv文件?在firefox上工作
我正在与一个奇怪的错误作斗争。我有一个简单的web应用程序,它从数据库中获取内容,然后将其输出为可下载的csv文件。它可以在firefox和chrome上运行,但IE无法将其识别为csv文件(认为它是html fle),当我单击“保存”时,会出现错误,“无法从{name of site}下载{name of file}。无法打开此internet站点…” 代码: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
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成功了。谢谢多个缓存控制头不是只发送第二个头吗?