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";

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.


2
Lubię budować ten ciąg System.Net.Mime.ContentDisposition.
Ronnie Overby



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");

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 ...


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();

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");
}

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');

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.


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.


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.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.