Saya perlu mengirim file CSV dalam respons HTTP. Bagaimana saya bisa mengatur respons keluaran sebagai format CSV?
Ini tidak bekerja:
Response.ContentType = "application/CSV";
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:
Menggunakan text/csv
adalah jenis yang paling tepat.
Anda juga harus mempertimbangkan untuk menambahkan Content-Disposition
tajuk 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.
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");
Coba salah satu dari tipe mime ini (dari sini: http://filext.com/file-extension/CSV )
Juga, tipe-pantomim mungkin peka terhadap huruf ...
Gunakan saja seperti itu
Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
return new EmptyResult()
untuk mendapatkan nama file untuk tetap. Kalau tidak, IE akan mencoba dan menyimpan file sebagai ActionName.htm
.
Di ASP.net MVC, Anda dapat menggunakan FileContentResult
dan File
metode:
public FileContentResult DownloadManifest() {
byte[] csvData = getCsvData();
return File(csvData, "text/csv", "filename.csv");
}
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');
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.
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.