2008-12-26 46 views

Trả lời

418

Sử dụng text/csv là loại thích hợp nhất.

Bạn cũng nên cân nhắc thêm tiêu đề Content-Disposition vào phản hồi. Thường thì một văn bản/csv sẽ được tải bởi Internet Explorer trực tiếp vào một phiên bản Excel được lưu trữ. Điều này có thể hoặc có thể không phải là một kết quả mong muốn.

Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv"); 

Ở trên sẽ khiến hộp thoại "Lưu dưới dạng" xuất hiện có thể là ý của bạn.

+4

Firefox 3.0.10 dường như yêu cầu giá trị của tiêu đề phải theo thứ tự ngược lại: tệp đính kèm; filename = myfilename.csv –

+3

Theo RFC# 2183 đầu tiên là kiểu (tệp đính kèm) và sau đó là các tham số (tên tệp, v.v.) –

+0

Thứ tự đúng trong giá trị tiêu đề. –

45

Sử dụng text/csv như các loại nội dung.

+0

Đúng vậy, bạn nên sử dụng văn bản trong nơi ứng dụng. – Biswanath

23

Hãy thử một trong những mime-loại khác (từ đây: http://filext.com/file-extension/CSV)

  • text/bằng dấu phẩy-giá trị
  • text/csv
  • application/csv
  • application/trội
  • application/vnd.ms-excel
  • application/vnd.msexcel

Ngoài ra, mime-type thể là trường hợp nhạy cảm ...

2

Thiết lập kiểu nội dung và bố trí nội dung như đã nêu trên tạo ra một cách hoang dại kết quả khác nhau với các trình duyệt khác nhau:

IE8: SaveAs thoại như mong muốn, và Excel là ứng dụng mặc định. 100% tốt.

Firefox: Hộp thoại SaveAs hiện lên, nhưng Firefox không biết đó là bảng tính. Đề xuất mở nó bằng Visual Studio! 50% tốt

Chrome: các gợi ý được bỏ qua hoàn toàn. Dữ liệu CSV được hiển thị trong trình duyệt. 0% tốt.

Tất nhiên trong tất cả các trường hợp này, tôi đề cập đến các trình duyệt khi chúng ra khỏi hộp, không có tùy chỉnh ánh xạ ứng dụng/mime.

+0

Nếu Firefox muốn bạn mở bằng Visual Studio, có nghĩa là bạn đang xuất HTML chứ không phải CSV. – Martin

+0

Điều này có vẻ không phải là trường hợp trong năm 2014, nó hoạt động tốt trong tất cả chúng đối với tôi. – MikeKulls

+0

Vui lòng xác định "như được mô tả ở trên" – xhienne

15

Chỉ cần sử dụng như thế

Response.Clear(); 
Response.ContentType = "application/CSV"; 
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\""); 
Response.Write(t.ToString()); 
Response.End(); 
+0

Đừng quên trả lời.clear() trước tiên. – Chris

+0

Kèm theo tên tệp trong dấu ngoặc kép cố định điều này cho tôi khi khách hàng là Firefox. – Graham

+0

Nếu bạn đang sử dụng điều này trong một bộ điều khiển MVC, bạn sẽ cần phải kết thúc phương pháp điều khiển với 'return new EmptyResult()' để lấy tên tập tin cần dán. Nếu không thì IE sẽ thử và lưu tệp dưới dạng 'ActionName.htm'. –

46

Qua nhiều năm tôi đã được mài giũa một bộ hoàn hảo của tiêu đề này mà làm việc rực rỡ trên mọi trình duyệt mà tôi biết

// these headers avoid IE problems when using https: 
// see http://support.microsoft.com/kb/812935 
header("Cache-Control: must-revalidate"); 
header("Pragma: must-revalidate"); 

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

Nếu bạn sử dụng ứng dụng/vnd.ms-excel. Trên osx safari thêm phần mở rộng tệp ".xls" –

2

Tôi đề nghị để chèn ký tự '/' vào trước 'myfilename.cvs '

Response.AddHeader("Content-Disposition", "attachment;filename=/myfilename.csv"); 

Tôi hy vọng bạn sẽ có kết quả tốt hơn.

2

Tôi đã phát hiện ra rằng vấn đề với IE là nó ngửi dữ liệu trả về và tự quyết định về loại nội dung mà nó cho rằng nó đã được gửi đi. Có một số tác dụng phụ mà nguyên nhân này gây ra, chẳng hạn như luôn mở hộp thoại saveAs cho tệp văn bản vì bạn đang sử dụng nén dữ liệu trasnferes. Giải pháp là (trong mã php) ......

header('X-Content-Type-Options: nosniff'); 
5

Trong ASP.net MVC, bạn có thể sử dụng một FileContentResultFile phương pháp:

public FileContentResult DownloadManifest() { 
    byte[] csvData = getCsvData(); 
    return File(csvData, "text/csv", "filename.csv"); 
} 
Các vấn đề liên quan