ประเภทเนื้อหาการตอบสนองเป็น CSV


328

ฉันต้องการส่งไฟล์ CSV ในการตอบกลับ HTTP ฉันจะตั้งค่าการตอบกลับเป็นรูปแบบ CSV ได้อย่างไร

สิ่งนี้ไม่ทำงาน:

Response.ContentType = "application/CSV";

คำตอบ:


491

การใช้text/csvเป็นประเภทที่เหมาะสมที่สุด

คุณควรพิจารณาเพิ่มContent-Dispositionส่วนหัวในการตอบกลับ บ่อยครั้งที่ Internet Explorer จะโหลดข้อความ / csv ลงในอินสแตนซ์ที่โฮสต์ของ Excel โดยตรง นี่อาจเป็นผลลัพธ์ที่พึงประสงค์หรือไม่ก็ได้

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

ด้านบนจะทำให้กล่องโต้ตอบ "บันทึกเป็น" ปรากฏขึ้นซึ่งอาจเป็นสิ่งที่คุณต้องการ


2
ฉันต้องการใช้วัตถุ System.Net.Mime.ContentDisposition สำหรับการสร้างสตริงนั้น
Ronnie Overby



48

ในช่วงหลายปีที่ผ่านมาฉันได้สร้างส่วนหัวที่สมบูรณ์แบบสำหรับการทำงานที่ยอดเยี่ยมในเบราว์เซอร์ทั้งหมดที่ฉันรู้จัก

// 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 บน osx safari เพิ่มส่วนขยายไฟล์ ".xls"
Luke Smith

28

ลองหนึ่งใน mime-types อื่น ๆ (จากที่นี่: http://filext.com/file-extension/CSV )

  • ข้อความ / คั่นด้วยเครื่องหมายจุลภาคค่า
  • ข้อความ / CSV
  • แอพลิเคชัน / CSV
  • แอพลิเคชัน / Excel
  • application / vnd.ms-Excel
  • แอพลิเคชัน / vnd.msexcel

นอกจากนี้ mime-type อาจคำนึงถึงขนาดตัวพิมพ์...


15

เพียงใช้แบบนั้น

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

การใส่ชื่อไฟล์ในเครื่องหมายคำพูดคู่จะช่วยแก้ไขปัญหานี้สำหรับฉันเมื่อไคลเอนต์คือ Firefox
เกรแฮม

1
หากคุณกำลังใช้สิ่งนี้ในตัวควบคุม MVC คุณจะต้องจบเมธอดคอนโทรลเลอร์ด้วยreturn new EmptyResult()เพื่อให้ชื่อไฟล์ติด มิฉะนั้น IE ActionName.htmจะลองและบันทึกแฟ้มเป็น
3Dave


3

ฉันพบว่าปัญหาของ IE คือดมกลิ่นข้อมูลที่ส่งคืนและตัดสินใจเกี่ยวกับประเภทเนื้อหาที่คิดว่าถูกส่งไปแล้ว มีผลข้างเคียงจำนวนมากที่ทำให้เกิดเช่นเปิดกล่องโต้ตอบ saveAs สำหรับไฟล์ข้อความเสมอเนื่องจากคุณกำลังใช้การบีบอัดข้อมูลที่ส่งผ่าน การแก้ปัญหาคือ (ในรหัส PHP) ......

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

2

การตั้งค่าประเภทเนื้อหาและการจัดการเนื้อหาตามที่อธิบายไว้ข้างต้นจะให้ผลลัพธ์ที่แตกต่างกันอย่างดุเดือดด้วยเบราว์เซอร์ที่แตกต่างกัน:

IE8: ไดอะล็อก SaveAs ตามที่ต้องการและ Excel เป็นแอปเริ่มต้น ดี 100%

Firefox: กล่องโต้ตอบ SaveAs จะปรากฏขึ้น แต่ Firefox ไม่ทราบว่าเป็นสเปรดชีต แนะนำให้เปิดกับ Visual Studio! ดี 50%

Chrome: คำแนะนำจะถูกละเว้นอย่างสมบูรณ์ ข้อมูล CSV จะแสดงในเบราว์เซอร์ ดี 0%

แน่นอนในทุกกรณีฉันกำลังอ้างถึงเบราว์เซอร์เมื่อพวกเขาออกมาจากกล่องโดยไม่มีการปรับแต่งการแม็พ mime / แอปพลิเคชัน


หาก Firefox ต้องการให้คุณเปิดด้วย Visual Studio หมายความว่าคุณกำลังส่งออก HTML ไม่ใช่ CSV
Martin

นี่ดูเหมือนจะไม่เป็นเช่นนั้นในปี 2014 มันใช้ได้ดีสำหรับฉันทั้งหมด
MikeKulls

โปรดกำหนด "ตามที่อธิบายไว้ข้างต้น"
xhienne

2

ฉันแนะนำให้ใส่ตัวอักษร '/' หน้า 'myfilename.cvs'

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

ฉันหวังว่าคุณจะได้รับผลลัพธ์ที่ดีกว่า


0

สำหรับ 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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.