Тип содержимого ответа как CSV

328

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

Это не работает:

Response.ContentType = "application/CSV";
balaweblog
источник

Ответы:

491

Использование text/csvявляется наиболее подходящим типом.

Вы также должны рассмотреть возможность добавления Content-Dispositionзаголовка к ответу. Часто текст / CSV будет загружен Internet Explorer непосредственно в размещенный экземпляр Excel. Это может или не может быть желательным результатом.

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

Выше появится диалоговое окно «Сохранить как», которое может быть тем, что вы намереваетесь.

AnthonyWJones
источник
2
Мне нравится использовать объект System.Net.Mime.ContentDisposition для построения этой строки.
Ронни Оверби
62

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

IBZ
источник
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-тип может быть чувствительным к регистру ...

diclophis
источник
15

Просто используйте так

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
GateKiller
источник
Заключение имени файла в двойные кавычки исправило это для меня, когда клиент 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');
Wookie
источник
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");

Я надеюсь, что вы получите лучшие результаты.

Jaider
источник
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.
Суреш Камруши
источник