CSV olarak Yanıt İçeriği türü


328

HTTP yanıtında bir CSV dosyası göndermem gerekiyor. Çıkış yanıtını CSV biçimi olarak nasıl ayarlayabilirim?

Bu çalışmıyor:

Response.ContentType = "application/CSV";

Yanıtlar:


491

Kullanmak text/csven uygun tiptir.

Ayrıca Content-Dispositionyanıta bir başlık eklemeyi de düşünmelisiniz . Genellikle bir metin / csv, Internet Explorer tarafından doğrudan barındırılan bir Excel örneğine yüklenir. Bu istenen bir sonuç olabilir veya olmayabilir.

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

Yukarıdaki, istediğiniz gibi olabilecek bir dosya "Farklı kaydet" iletişim kutusunun görüntülenmesine neden olur.


2
Bu dize oluşturmak için bir System.Net.Mime.ContentDisposition nesnesi kullanmayı seviyorum.
Ronnie Overby


62

text/csvİçerik türü olarak kullanın .


48

Yıllar boyunca bunun için bildiğim tüm tarayıcılarda mükemmel bir şekilde çalışan mükemmel bir başlık seti

// 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 kullanıyorsanız. On osx safari bir ".xls" dosya uzantısı ekler
Luke Smith

28

Bu diğer mime türlerinden birini deneyin (buradan: http://filext.com/file-extension/CSV )

  • metin / virgülle ayrılmış değer
  • metin / csv
  • Uygulama / CSV
  • Uygulama / Excel
  • Uygulama / vnd.ms-Excel
  • Uygulama / vnd.msexcel

Ayrıca, mime tipi büyük / küçük harfe duyarlı olabilir ...


15

Sadece böyle kullan

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();

Dosya adını çift tırnak içine almak, istemci Firefox olduğunda bunu düzeltti.
Graham

1
Bunu bir MVC denetleyicisinde kullanıyorsanız return new EmptyResult(), dosya adının yapışmasını sağlamak için denetleyici yöntemini sonlandırmanız gerekir . Aksi takdirde IE dosyayı olarak deneyecek ve kaydedecektir ActionName.htm.
3Dave

5

ASP.net MVC'de bir FileContentResultve Fileyöntemini kullanabilirsiniz:

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

3

IE ile ilgili sorun, geri dönüş verisini kokluyor ve hangi içerik türü gönderildiğini düşündüğü konusunda kendi fikrini oluşturuyor. Bunun neden olduğu, veri dosyalarının sıkıştırılmasını kullandığınız için metin dosyaları için daima bir saveAs iletişim kutusunu açmak gibi bir dizi yan etki vardır. Çözüm (php kodunda) ......

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

2

İçerik türünü ve içerik düzenini yukarıda açıklandığı gibi ayarlamak, farklı tarayıcılarda çok çeşitli sonuçlar verir:

IE8: İstediğiniz gibi Kaydet iletişim kutusu ve varsayılan uygulama olarak Excel. % 100 iyi.

Firefox: SaveAs iletişim kutusu görünür, ancak Firefox'un bir e-tablo olduğu hakkında hiçbir fikri yoktur. Visual Studio ile açılmasını önerir! % 50 iyi

Chrome: ipuçları tamamen yok sayılır. CSV verileri tarayıcıda gösterilir. % 0 iyi.

Tabii ki tüm bu durumlarda mime / uygulama eşleştirmeleri özelleştirme olmadan, onlar kutudan çıkarken tarayıcılar atıfta bulunuyorum.


Firefox, Visual Studio ile açmanızı isterse, CSV'yi değil HTML'yi dışa aktardığınız anlamına gelir.
Martin

Bu 2014'te böyle görünmüyor, hepsinde benim için iyi çalıştı.
MikeKulls

Lütfen "yukarıda açıklandığı gibi" tanımlayın
xhienne

2

'Dosyaadı.cvs' önüne bir '/' karakteri eklemenizi öneririm

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

Umarım daha iyi sonuçlar alırsınız.


0

C # MVC 4.5 için aşağıdakileri yapmanız gerekir:

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.