2010-02-09 31 views
34

Tôi đang gặp khó khăn với một lỗi lạ. Tôi có một ứng dụng web đơn giản lấy nội dung từ một DB rồi xuất ra dưới dạng tệp csv có thể tải xuống. Nó hoạt động trên firefox và chrome, nhưng IE không nhận ra nó dưới dạng tệp csv (nghĩ rằng đó là một html fle) và khi tôi nhấp vào lưu, tôi nhận được lỗi, "Không thể tải xuống {name of file} từ {name of site} . không thể mở trang web internet này ..."Làm cách nào để tải xuống tệp csv trên IE? Hoạt động trên firefox

Mã số:.

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";  
} 

tôi đã chơi xung quanh với các content-type cả một bó, nhưng điều đó không có hiệu lực.

Cập nhật: Tôi đã thử văn bản/csv, ứng dụng/vnd.ms-excel (và các biến thể của điều này), văn bản/đồng bằng và một số thứ khác mà giờ đây tôi quên không có may mắn.

Đây là IE8 btw.

Cập nhật 2: Kết nối qua SSL.

+2

bạn đã thử loại nội dung nào khác? Tôi thường sử dụng 'text/csv' – prodigitalson

Trả lời

56

Chúng tôi không yêu IE? :)

Hãy thử sử dụng những tiêu đề:

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"); 

Tôi nghĩ rằng kiểu nội dung octet-stream buộc IE để tải file.

+2

Tôi đã tìm thấy các tiêu đề tối thiểu cho FF 3.6 và IE 8 là: header (" Cache-Control: phải-revalidate, post-check = 0, pre-check = 0 "); header ("Content-type: application/octet-stream"); header ("Content-Disposition: attachment; filename = \" ". $ filename." \ ""); – Ben

+5

Oh yeah IE Tôi yêu nó

+0

Ah, hãy ném ra một plugin Excel cũ và cuộn trình tạo CSV của riêng bạn - IE8 barfs trên tất cả các phần tải xuống của bạn. Cảm ơn bạn:] – phatskat

-1

Bạn đã thử loại Nội dung: text/csv chưa?

1

Thử đặt loại nội dung của bạn thành text/csv thay vì application/octet-stream.

Vì ứng dụng/octet-stream là loại mime nhị phân chung (và không khớp với phần mở rộng '.csv'), trình khám phá Internet có thể bỏ qua nó và tính loại mime dựa trên phần mở rộng của tệp.

+0

Tôi đã có điều này ban đầu, không có niềm vui. –

-1

Một số thời gian trước đây tôi gặp sự cố với IE6 khi mở tệp pdf và gặp sự cố khi AdobeReader 6.0 được cài đặt và cố gắng mở tệp trong cửa sổ trình duyệt. Hơn tôi tìm thấy một nơi nào đó tiêu đề này:

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

Và nó giải quyết được vấn đề, mọi tệp pdf được tải xuống và mở trong Adobe thay vì IE.

4

Tôi đã thành công với những điều sau đây:

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

Thiết loại để application/vnd.ms-excel dường như làm các trick trong trường hợp của tôi. Đây là tất cả trong một tệp được mở bằng cách gửi biểu mẫu bằng cách sử dụng

target="_blank" 
6

Gần đây, chúng tôi đã gặp phải sự cố này. Xem này MSKB article

Đây là những tiêu đề chúng tôi đã sử dụng để làm cho nó hoạt động trên 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

Đã thử một số trong số này và các kết hợp khác nhau. Sử dụng RegEdit đã làm các trick. Cảm ơn! – marklark

+0

Không có nhiều tiêu đề Bộ nhớ cache kiểm soát chỉ khiến tiêu đề thứ hai được gửi đi không? – Ross

4

duy nhất mã thêm tôi đã có thêm cho IE để làm việc với SSL là: header("Pragma: public"); Vì vậy, tiêu đề của tôi trông như thế này bây giờ:

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

tiêu đề ("Pragma: public"); làm việc tốt cho tôi cũng với ssl. Cảm ơn –

-1

này chỉ đơn giản là không có ý nghĩa.Tôi đã thử câu trả lời được chấp nhận, tất cả các câu trả lời khác ở đây, và nó không hiệu quả với tôi. Tôi cố gắng hoán vị của họ, và bằng cách nào đó tôi quản lý để làm cho nó làm việc trong IE như sau:

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(); 

Một điều tôi đã làm là để xóa bộ nhớ cache mỗi khi freaking tôi thử nghiệm mã. Và nó vẫn không có ý nghĩa. Chỉ trong trường hợp ai đó có thể cần điều này một cách tuyệt vọng;)

+0

Tôi nghĩ rằng nó nên là "application/vnd.ms-excel". excel với "L" – Dave

+0

Tùy thuộc vào nền tảng người dùng cuối, "Content-Type: application/vnd.ms-exce" sẽ không hoạt động trên máy Mac và Linux. Miễn là tất cả khách truy cập trang của bạn đều chạy Windows thì bạn vẫn ổn. –

2

Chúng tôi vừa gặp vấn đề tương tự và sau khi thêm nhiều tiêu đề và nhận được liên kết hoạt động, tôi đã xóa từng mục và tìm thấy khóa chính cho chúng tôi là "Cache- Kiểm soát: công khai " vì vậy cuối cùng chúng tôi chỉ có

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

hoạt động tốt.

+0

Bạn vừa mới tiết kiệm cho tôi số giờ làm việc! Cảm ơn bạn rất nhiều! – toon81

0

Các giải pháp đối với tôi là:

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

Nếu bạn đang cố gắng để hoàn thành nhiệm vụ này (nhận được một tập tin CSV để tải về trong IE8) sử dụng Salesforce.com (trong trường hợp của bạn mà front- cuối cùng là Visualforce và bạn không thể đặt tất cả các tiêu đề, chỉ có một số trong số họ), đây là những gì bạn cần:

<apex:page cache="true" 
     contentType="application/octet-stream#myAwesomeFileName.csv" 
     showHeader="false" sidebar="false" standardStylesheets="false"> 
    <apex:outputText value="{!csvContent}" escape="false"/> 
</apex:page> 

các phần quan trọng ở đây là cache=true, trong đó, con ngã ba với các thuộc tính mặc định expires=0, đạt các tiêu đề sau:

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

Và sau đó contentType của application/octet-stream --- làm text/csv không cho IE8.

-1

Sau khi sử dụng Javascript, nó sẽ giải quyết vấn đề của bạn.

Sử dụng này cho IE,

var IEwindow = window.open(); 
    IEwindow.document.write('sep=,\r\n' + CSV); 
    IEwindow.document.close(); 
    IEwindow.document.execCommand('SaveAs', true, fileName + ".csv"); 
    IEwindow.close(); 

Để biết thêm thông tin tôi đã viết hướng dẫn về điều đó, see - Download JSON data in CSV format Cross Browser Support

Hy vọng điều này sẽ rất hữu ích cho bạn.

Các vấn đề liên quan