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

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.


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


62

Gunakan text/csvsebagai tipe konten.


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

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


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

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

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

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.


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.


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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.