2010-02-09 84 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

希望這將是對你有幫助。