Muszę wysłać plik CSV w odpowiedzi HTTP. Jak ustawić odpowiedź wyjściową jako format CSV?
To nie działa:
Response.ContentType = "application/CSV";
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:
Za pomocą text/csv
jest najbardziej odpowiednim typem.
Powinieneś również rozważyć dodanie Content-Disposition
nagłó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.
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");
Wypróbuj jeden z tych innych typów MIME (stąd: http://filext.com/file-extension/CSV )
Ponadto typ MIME może rozróżniać małe i wielkie litery ...
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();
return new EmptyResult()
aby nazwa pliku została zachowana. W przeciwnym razie IE spróbuje zapisać plik jako ActionName.htm
.
W ASP.net MVC możesz użyć a FileContentResult
oraz File
metody:
public FileContentResult DownloadManifest() {
byte[] csvData = getCsvData();
return File(csvData, "text/csv", "filename.csv");
}
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');
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.
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.