Мне нужно отправить CSV файл в ответ HTTP. Как установить выходной ответ в формате CSV?
Это не работает:
Response.ContentType = "application/CSV";
Мне нужно отправить CSV файл в ответ HTTP. Как установить выходной ответ в формате CSV?
Это не работает:
Response.ContentType = "application/CSV";
Использование text/csv
- наиболее подходящий тип.
Вы также должны рассмотреть возможность добавления заголовка Content-Disposition
в ответ. Часто текст /csv загружается Internet Explorer непосредственно в размещенный экземпляр Excel. Это может быть или не быть желательным результатом.
Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv");
Приведенное выше приведет к появлению диалогового окна "Сохранить как", которое может быть тем, что вы намерены.
MIME-тип CSV - это текст /csv в соответствии с RFC 4180.
На протяжении многих лет я оттачивал идеальный набор заголовков для этого, который блестяще работает во всех браузерах, которые я знаю о
// 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");
В качестве типа содержимого используйте text/csv
.
Попробуйте использовать один из этих других типов mime (отсюда: http://filext.com/file-extension/CSV)
Кроме того, тип mime может быть чувствителен к регистру...
Просто используйте это
Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
В ASP.net MVC вы можете использовать метод FileContentResult
и File
:
public FileContentResult DownloadManifest() {
byte[] csvData = getCsvData();
return File(csvData, "text/csv", "filename.csv");
}
Настройка типа контента и расположения контента, как описано выше, дает разные результаты в разных браузерах:
IE8: диалог SaveAs, а Excel - как приложение по умолчанию. 100% хорошо.
Firefox: диалог SaveAs отображается, но Firefox не имеет представления, что это электронная таблица. Предлагает открыть его с помощью Visual Studio! 50% хороших
Chrome: подсказки полностью игнорируются. Данные CSV отображаются в браузере. 0% хорошо.
Конечно, во всех этих случаях я имею в виду браузеры, когда они выходят из них, без настройки сопоставлений mime/application.
Я предлагаю вставить символ '/' перед 'myfilename.cvs'
Response.AddHeader("Content-Disposition", "attachment;filename=/myfilename.csv");
Надеюсь, вы получите лучшие результаты.
Я обнаружил, что проблема с IE заключается в том, что она обнюхивает возвращаемые данные и сама думает о том, какой тип контента он считает отправленным. Есть ряд побочных эффектов, которые это вызывает, например, всегда открывать диалог saveAs для текстовых файлов, потому что вы используете сжатие данных trasnferes. Решение (в php-коде)...
header('X-Content-Type-Options: nosniff');