Loại nội dung phản hồi dưới dạng CSV


328

Tôi cần gửi một tệp CSV trong phản hồi HTTP. Làm cách nào tôi có thể đặt phản hồi đầu ra ở định dạng CSV?

Đây không phải là làm việc:

Response.ContentType = "application/CSV";

Câu trả lời:


491

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

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

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

Ở trên sẽ làm cho một hộp thoại "Lưu dưới dạng" xuất hiện có thể là những gì bạn dự định.


2
Tôi thích sử dụng một đối tượng System.Net.Mime.ContentDisposeition để xây dựng chuỗi đó.
Ronnie Overby


62

Sử dụng text/csvlàm loại nội dung.


48

Trong những năm qua, tôi đã mài giũa một bộ tiêu đề hoàn hảo cho việc này hoạt động tuyệt vời trong tất cả các 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");

7
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"
Luke Smith

28

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

  • văn bản / dấu phẩy được phân tách-giá trị
  • văn bản / csv
  • ứng dụng / csv
  • ứng dụng / excel
  • ứng dụng / vnd.ms-excel
  • ứng dụng / vnd.msexcel

Ngoài ra, loại mime có thể phân biệt chữ hoa chữ thường ...


text/csvlàm việc cho tôi
thần thánh

15

Chỉ sử dụng như vậy

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

Việc đặt tên tệp trong dấu ngoặc kép đã sửa lỗi này cho tôi khi máy khách là Firefox.
Graham

1
Nếu bạn đang sử dụng điều này trong bộ điều khiển MVC, bạn sẽ cần kết thúc phương thức của bộ điều khiển return new EmptyResult()để lấy tên tệp. Nếu không IE sẽ thử và lưu tệp dưới dạng ActionName.htm.
3Dave

5

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

public FileContentResult DownloadManifest() {
    byte[] csvData = getCsvData();
    return File(csvData, "text/csv", "filename.csv");
}

3

Tôi đã phát hiện ra rằng vấn đề với IE là nó đánh hơi dữ liệu trả về và tạo ra suy nghĩ của riêng mình về loại nội dung mà nó nghĩ rằng nó đã được gử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 các tệp văn bản vì bạn đang sử dụng tính năng nén dữ liệu. Giải pháp là (bằng mã php) ......

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

2

Đặt loại nội dung và bố trí nội dung như được mô tả ở trên tạo ra kết quả rất khác nhau với các trình duyệt khác nhau:

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

Firefox: Hộp thoại SaveAs hiện lên, nhưng Firefox không biết đó là bảng tính. Đề nghị mở nó với 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 đang đề 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ạ mime / ứng dụng.


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

Điều này dường như 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 cho tôi.
MikeKulls

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

2

Tôi đề nghị chèn một ký tự '/' phía trước 'myfilename.cvs'

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

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


0

Đối với C # MVC 4.5, bạn cần làm như thế này:

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".csv\"");
Response.Write(dataNeedToPrint);
Response.End();
return new EmptyResult();  //this line is important else it will not work.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.