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";
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:
Sử dụng text/csv
là loại thích hợp nhất.
Bạn cũng nên xem xét thêm một Content-Disposition
tiê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.
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");
Hãy thử một trong những loại mime khác (từ đây: http://filext.com/file-extension/CSV )
Ngoài ra, loại mime có thể phân biệt chữ hoa chữ thường ...
text/csv
làm việc cho tôi
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();
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
.
Trong ASP.net MVC, bạn có thể sử dụng một FileContentResult
và File
phương thức:
public FileContentResult DownloadManifest() {
byte[] csvData = getCsvData();
return File(csvData, "text/csv", "filename.csv");
}
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');
Đặ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.
Đố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.