我正在努力解决一个奇怪的错误。我有一个简单的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。
答案 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失败了。