ฉันต้องการส่งไฟล์ CSV ในการตอบกลับ HTTP ฉันจะตั้งค่าการตอบกลับเป็นรูปแบบ CSV ได้อย่างไร
สิ่งนี้ไม่ทำงาน:
Response.ContentType = "application/CSV";
ฉันต้องการส่งไฟล์ CSV ในการตอบกลับ HTTP ฉันจะตั้งค่าการตอบกลับเป็นรูปแบบ CSV ได้อย่างไร
สิ่งนี้ไม่ทำงาน:
Response.ContentType = "application/CSV";
คำตอบ:
การใช้text/csv
เป็นประเภทที่เหมาะสมที่สุด
คุณควรพิจารณาเพิ่มContent-Disposition
ส่วนหัวในการตอบกลับ บ่อยครั้งที่ Internet Explorer จะโหลดข้อความ / csv ลงในอินสแตนซ์ที่โฮสต์ของ Excel โดยตรง นี่อาจเป็นผลลัพธ์ที่พึงประสงค์หรือไม่ก็ได้
Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv");
ด้านบนจะทำให้กล่องโต้ตอบ "บันทึกเป็น" ปรากฏขึ้นซึ่งอาจเป็นสิ่งที่คุณต้องการ
ชนิดไมม์ของ CSV เป็นข้อความ / CSVตามRFC 4180
ใช้text/csv
เป็นประเภทเนื้อหา
ในช่วงหลายปีที่ผ่านมาฉันได้สร้างส่วนหัวที่สมบูรณ์แบบสำหรับการทำงานที่ยอดเยี่ยมในเบราว์เซอร์ทั้งหมดที่ฉันรู้จัก
// 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");
ลองหนึ่งใน mime-types อื่น ๆ (จากที่นี่: http://filext.com/file-extension/CSV )
นอกจากนี้ mime-type อาจคำนึงถึงขนาดตัวพิมพ์...
เพียงใช้แบบนั้น
Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
return new EmptyResult()
เพื่อให้ชื่อไฟล์ติด มิฉะนั้น IE ActionName.htm
จะลองและบันทึกแฟ้มเป็น
ใน ASP.net MVC คุณสามารถใช้FileContentResult
และFile
วิธี:
public FileContentResult DownloadManifest() {
byte[] csvData = getCsvData();
return File(csvData, "text/csv", "filename.csv");
}
ฉันพบว่าปัญหาของ IE คือดมกลิ่นข้อมูลที่ส่งคืนและตัดสินใจเกี่ยวกับประเภทเนื้อหาที่คิดว่าถูกส่งไปแล้ว มีผลข้างเคียงจำนวนมากที่ทำให้เกิดเช่นเปิดกล่องโต้ตอบ saveAs สำหรับไฟล์ข้อความเสมอเนื่องจากคุณกำลังใช้การบีบอัดข้อมูลที่ส่งผ่าน การแก้ปัญหาคือ (ในรหัส PHP) ......
header('X-Content-Type-Options: nosniff');
การตั้งค่าประเภทเนื้อหาและการจัดการเนื้อหาตามที่อธิบายไว้ข้างต้นจะให้ผลลัพธ์ที่แตกต่างกันอย่างดุเดือดด้วยเบราว์เซอร์ที่แตกต่างกัน:
IE8: ไดอะล็อก SaveAs ตามที่ต้องการและ Excel เป็นแอปเริ่มต้น ดี 100%
Firefox: กล่องโต้ตอบ SaveAs จะปรากฏขึ้น แต่ Firefox ไม่ทราบว่าเป็นสเปรดชีต แนะนำให้เปิดกับ Visual Studio! ดี 50%
Chrome: คำแนะนำจะถูกละเว้นอย่างสมบูรณ์ ข้อมูล CSV จะแสดงในเบราว์เซอร์ ดี 0%
แน่นอนในทุกกรณีฉันกำลังอ้างถึงเบราว์เซอร์เมื่อพวกเขาออกมาจากกล่องโดยไม่มีการปรับแต่งการแม็พ mime / แอปพลิเคชัน
ฉันแนะนำให้ใส่ตัวอักษร '/' หน้า 'myfilename.cvs'
Response.AddHeader("Content-Disposition", "attachment;filename=/myfilename.csv");
ฉันหวังว่าคุณจะได้รับผลลัพธ์ที่ดีกว่า
สำหรับ C # MVC 4.5 คุณต้องทำสิ่งนี้:
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.