Odpowiedź Typ zawartości jako CSV

328

Muszę wysłać plik CSV w odpowiedzi HTTP. Jak ustawić odpowiedź wyjściową jako format CSV?

To nie działa:

Response.ContentType = "application/CSV";
balaweblog
źródło

Odpowiedzi:

491

Za pomocą text/csv jest najbardziej odpowiednim typem.

Powinieneś również rozważyć dodanie Content-Dispositionnagłówka do odpowiedzi. Często tekst / csv będzie ładowany przez Internet Explorer bezpośrednio do hostowanej instancji programu Excel. To może, ale nie musi być pożądany wynik.

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

Powyższe spowoduje wyświetlenie okna dialogowego „Zapisz jako”, które może być tym, co zamierzasz.

AnthonyWJones
źródło
2
Lubię budować ten ciąg System.Net.Mime.ContentDisposition.
Ronnie Overby
151

Typ MIME CSV to text / csv zgodnie z RFC 4180 .

sastanina
źródło
62

Użyj text/csvjako typu zawartości.

ibz
źródło
48

Przez lata doskonaliłem doskonały zestaw nagłówków, który działa doskonale we wszystkich przeglądarkach, które znam

// 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");
niebezpieczny
źródło
7
Jeśli używasz aplikacji / vnd.ms-excel. Na osx safari dodaje rozszerzenie pliku „.xls”
Luke Smith
28

Wypróbuj jeden z tych innych typów MIME (stąd: http://filext.com/file-extension/CSV )

  • wartości oddzielone tekstem / przecinkami
  • tekst / csv
  • application / csv
  • aplikacja / excel
  • application / vnd.ms-excel
  • application / vnd.msexcel

Ponadto typ MIME może rozróżniać małe i wielkie litery ...

Diclophis
źródło
15

Po prostu użyj tak

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
GateKiller
źródło
Umieszczenie nazwy pliku w podwójnym cudzysłowie naprawiło to dla mnie, gdy klientem jest Firefox.
Graham
1
Jeśli używasz tego w kontrolerze MVC, musisz zakończyć metodę kontrolera, return new EmptyResult()aby nazwa pliku została zachowana. W przeciwnym razie IE spróbuje zapisać plik jako ActionName.htm.
3Dave
5

W ASP.net MVC możesz użyć a FileContentResultoraz Filemetody:

public FileContentResult DownloadManifest() {
    byte[] csvData = getCsvData();
    return File(csvData, "text/csv", "filename.csv");
}
Rob Church
źródło
3

Odkryłem, że problem z IE polega na tym, że wącha dane zwrotne i decyduje o tym, jaki typ zawartości uważa za wysłany. Istnieje wiele skutków ubocznych, które to powoduje, na przykład zawsze otwieranie okna dialogowego saveAs dla plików tekstowych, ponieważ używasz kompresji przesyłanych danych. Rozwiązaniem jest (w kodzie php) ......

header('X-Content-Type-Options: nosniff');
Wookie
źródło
2

Ustawienie typu zawartości i rozmieszczenia treści w sposób opisany powyżej powoduje bardzo różne wyniki w różnych przeglądarkach:

IE8: okno dialogowe SaveAs zgodnie z życzeniem, a Excel jako domyślna aplikacja. 100% dobra.

Firefox: pojawia się okno dialogowe SaveAs, ale Firefox nie ma pojęcia, że ​​jest to arkusz kalkulacyjny. Sugeruje otwarcie go w Visual Studio! 50% dobra

Chrome: wskazówki są w pełni ignorowane. Dane CSV są wyświetlane w przeglądarce. 0% dobrego.

Oczywiście we wszystkich tych przypadkach mam na myśli przeglądarki, gdy wychodzą z pudełka, bez dostosowywania mapowań MIME / aplikacji.


źródło
Jeśli Firefox chce, abyś otworzył za pomocą Visual Studio, oznacza to, że eksportujesz HTML, a nie CSV.
Martin
Wydaje się, że tak nie jest w 2014 r., Dla mnie wszystko działało dobrze.
MikeKulls
Proszę zdefiniować „jak opisano powyżej”
xhienne
2

Sugeruję wstawienie znaku „/” przed „myfilename.cvs”

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

Mam nadzieję, że uzyskasz lepsze wyniki.

Jaider
źródło
0

W przypadku C # MVC 4.5 musisz wykonać następujące czynności:

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.
Suresh Kamrushi
źródło