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

275

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

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

Response.ContentType = "application/CSV";
Теги:
csv
http

10 ответов

425
Лучший ответ

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

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

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

Приведенное выше приведет к появлению диалогового окна "Сохранить как", которое может быть тем, что вы намерены.

  • 4
    Firefox 3.0.10 требует, чтобы значение заголовка было в обратном порядке: вложение; имя файла = myfilename.csv
  • 3
    Согласно RFC # 2183 сначала указывается тип (вложение), а после него параметры (имя файла и т. Д.)
Показать ещё 2 комментария
112

MIME-тип CSV - это текст /csv в соответствии с RFC 4180.

47

В качестве типа содержимого используйте text/csv.

  • 1
    Правильно, вы должны использовать текст вместо приложения.
46

На протяжении многих лет я оттачивал идеальный набор заголовков для этого, который блестяще работает во всех браузерах, которые я знаю о

// 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"
24

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

  • текст/разделенный запятыми-значение
  • текст /CSV
  • приложение /CSV
  • приложение/первенствует
  • приложение/vnd.ms-первенствует
  • приложение /vnd.msexcel

Кроме того, тип mime может быть чувствителен к регистру...

14

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

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
  • 0
    Не забудьте сначала response.clear ().
  • 0
    Заключение имени файла в двойные кавычки исправило это для меня, когда клиент Firefox.
Показать ещё 1 комментарий
5

В ASP.net MVC вы можете использовать метод FileContentResult и File:

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

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

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

Я предлагаю вставить символ '/' перед 'myfilename.cvs'

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

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

2

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

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

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

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

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

  • 0
    Если Firefox хочет, чтобы вы открывали его в Visual Studio, это означает, что вы экспортируете HTML, а не CSV.
  • 0
    Похоже, что это не так в 2014 году, у меня все работало нормально.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню