Jenis konten Respons sebagai CSV

328

Saya perlu mengirim file CSV dalam respons HTTP. Bagaimana saya bisa mengatur respons keluaran sebagai format CSV?

Ini tidak bekerja:

Response.ContentType = "application/CSV";
balaweblog
sumber

Jawaban:

491

Menggunakan text/csvadalah jenis yang paling tepat.

Anda juga harus mempertimbangkan untuk menambahkan Content-Dispositiontajuk ke respons. Seringkali teks / csv akan dimuat oleh Internet Explorer langsung ke instance Excel yang dihosting. Ini mungkin atau mungkin bukan hasil yang diinginkan.

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

Di atas akan menyebabkan dialog file "Simpan sebagai" muncul yang mungkin Anda inginkan.

AnthonyWJones
sumber
2
Saya suka menggunakan objek System.Net.Mime.ContentDisposition untuk membangun string itu.
Ronnie Overby
151

Jenis MIME dari CSV adalah teks / csv menurut RFC 4180 .

sastanin
sumber
62

Gunakan text/csvsebagai tipe konten.

ibz
sumber
48

Selama bertahun-tahun saya telah mengasah satu set header yang sempurna untuk ini yang berfungsi dengan baik di semua browser yang saya tahu

// 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");
berbahaya
sumber
7
Jika Anda menggunakan aplikasi / vnd.ms-excel. Di osx safari menambahkan ekstensi file ".xls"
Luke Smith
28

Coba salah satu dari tipe mime ini (dari sini: http://filext.com/file-extension/CSV )

  • teks / nilai yang dipisahkan koma
  • teks / csv
  • aplikasi / csv
  • aplikasi / excel
  • application / vnd.ms-excel
  • application / vnd.msexcel

Juga, tipe-pantomim mungkin peka terhadap huruf ...

diklofis
sumber
15

Gunakan saja seperti itu

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
GateKiller
sumber
Menutup nama file dalam tanda kutip ganda memperbaiki ini untuk saya ketika klien adalah Firefox.
Graham
1
Jika Anda menggunakan ini di pengontrol MVC, Anda harus mengakhiri metode pengontrol dengan return new EmptyResult()untuk mendapatkan nama file untuk tetap. Kalau tidak, IE akan mencoba dan menyimpan file sebagai ActionName.htm.
3Dave
5

Di ASP.net MVC, Anda dapat menggunakan FileContentResultdan Filemetode:

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

Saya telah menemukan bahwa masalah dengan IE adalah bahwa ia mengendus data yang dikembalikan dan memutuskan sendiri tentang tipe konten yang menurutnya telah dikirim. Ada sejumlah efek samping yang disebabkan oleh hal ini, seperti selalu membuka dialog saveAs untuk file teks karena Anda menggunakan kompresi trasnfer data. Solusinya adalah (dalam kode php) ......

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

Mengatur jenis konten dan disposisi konten seperti dijelaskan di atas menghasilkan hasil yang sangat bervariasi dengan browser yang berbeda:

IE8: Dialog SaveAs seperti yang diinginkan, dan Excel sebagai aplikasi default. 100% bagus

Firefox: Dialog SaveAs memang muncul, tetapi Firefox tidak tahu itu adalah spreadsheet. Menyarankan untuk membukanya dengan Visual Studio! 50% bagus

Chrome: petunjuknya diabaikan sepenuhnya. Data CSV ditampilkan di browser. 0% bagus

Tentu saja dalam semua kasus ini saya merujuk ke browser saat mereka keluar dari kotak mereka, tanpa kustomisasi pemetaan mime / aplikasi.


sumber
Jika Firefox ingin Anda membuka dengan Visual Studio, berarti Anda mengekspor HTML dan bukan CSV.
Martin
Ini tampaknya tidak terjadi pada tahun 2014, itu bekerja dengan baik untuk saya semua.
MikeKulls
Silakan tentukan "seperti yang dijelaskan di atas"
xhienne
2

Saya sarankan untuk memasukkan karakter '/' di depan 'myfilename.cvs'

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

Saya harap Anda mendapatkan hasil yang lebih baik.

Jaider
sumber
0

Untuk C # MVC 4.5 yang perlu Anda lakukan seperti ini:

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
sumber