Тип содержимого ответа как 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 для построения этой строки.
Ронни Оверби


62

Используйте text/csvв качестве типа контента.


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

Попробуйте один из этих других типов пантомимы (отсюда: http://filext.com/file-extension/CSV )

  • Текст / разделенный запятыми-значение
  • текст / CSV
  • Приложение / CSV
  • Приложение / первенствует
  • применение / vnd.ms-первенствуйте
  • Приложение / 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 заключается в том, что он перехватывает возвращаемые данные и сам решает, какой тип контента он считает отправленным. Это вызывает ряд побочных эффектов, таких как постоянное открытие диалогового окна saveAs для текстовых файлов, поскольку вы используете сжатие данных. Решение (в PHP-код) ......

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

2

Установка типа контента и расположения контента, как описано выше, дает сильно отличающиеся результаты в разных браузерах:

IE8: диалог SaveAs по желанию и Excel в качестве приложения по умолчанию. 100% хорошо.

Firefox: диалог SaveAs действительно появляется, но Firefox не знает, что это электронная таблица. Предлагает открыть его с помощью Visual Studio! 50% хорошо

Хром: подсказки полностью игнорируются. Данные CSV отображаются в браузере. 0% хорошо.

Конечно, во всех этих случаях я имею в виду браузеры, которые выходят из коробки, без настройки отображений mime / приложения.


Если 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.