Тип вмісту відповіді як CSV


328

Мені потрібно надіслати файл CSV у відповіді HTTP. Як я можу встановити відповідь на вихід у форматі CSV?

Це не працює:

Response.ContentType = "application/CSV";

Відповіді:


491

Використання text/csvє найбільш підходящим типом.

Слід також розглянути можливість додавання Content-Dispositionзаголовка до відповіді. Часто текст / csv завантажується Internet Explorer безпосередньо в розміщений екземпляр Excel. Це може бути або не бути бажаним результатом.

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

Вищезазначене призведе до появи діалогового вікна "Зберегти як", який може бути тим, що ви маєте намір.


2
Мені подобається використовувати об'єкт System.Net.Mime.ContentDisposition для побудови цього рядка.
Ронні Овербі



48

Протягом багатьох років я налагоджував ідеальний набір заголовків для цього, які блискуче працюють у всіх браузерах, про які я знаю

// 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
Якщо ви використовуєте application / vnd.ms-excel. На osx safari додається розширення файлу ".xls"
Люк Сміт

28

Спробуйте один із цих інших типів mime (звідси: http://filext.com/file-extension/CSV )

  • текст / знаки, розділені комами
  • текст / csv
  • додаток / csv
  • заявка / відмінність
  • застосування / vnd.ms-excel
  • додаток / vnd.msexcel

Крім того, тип mime може бути чутливим до регістру ...


15

Просто використовуйте так

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

Замикання імені файлу у подвійних лапки зафіксовано це для мене, коли клієнт Firefox
Грем

1
Якщо ви використовуєте це в контролері MVC, вам потрібно буде закінчити метод контролера, return new EmptyResult()щоб заставити ім'я файлу. Інакше IE спробує зберегти файл як ActionName.htm.
3Dave

5

В ASP.net MVC ви можете використовувати a FileContentResultі Fileметод:

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

3

Я виявив, що проблема з IE полягає в тому, що він нюхає повернуті дані та вирішує питання про те, який тип контенту він вважає надісланим. Це викликає ряд побічних ефектів, таких як завжди відкриття діалогового вікна збереження для текстових файлів, оскільки ви використовуєте стиснення даних trasnferes. Рішення полягає в (в PHP-коді) ......

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

2

Встановлення типу вмісту та розміщення вмісту, як описано вище, дає результати, які різко змінюються в різних браузерах:

IE8: Діалогове вікно SaveAs за бажанням та Excel як додаток за замовчуванням. 100% добре.

Firefox: діалогове вікно SaveAs відображається, але Firefox не має уявлення, що це електронна таблиця. Пропонує відкрити його за допомогою Visual Studio! 50% добре

Chrome: підказки повністю ігноруються. Дані CSV відображаються у браузері. 0% добре

Звичайно, у всіх цих випадках я маю на увазі веб-переглядачі, коли вони виходять із вікна, без налаштування відображення mime / map.


Якщо Firefox хоче, щоб ви відкривались із Visual Studio, це означає, що ви експортуєте HTML, а не CSV.
Мартін

Здається, це не було так у 2014 році, для мене це працювало чудово.
MikeKulls

Будь ласка, визначте "як описано вище"
xhienne

2

Я пропоную вставити символ "/" перед "myfilename.cvs"

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

Сподіваюся, ви отримаєте кращі результати.


0

Для C # MVC 4.5 вам потрібно зробити так:

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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.