จะใช้ CSV MIME-type ได้อย่างไร?


125

ในเว็บแอปพลิเคชันที่ฉันกำลังทำงานอยู่ผู้ใช้สามารถคลิกลิงก์ไปยังไฟล์ CSV ไม่มีการตั้งค่าส่วนหัวสำหรับประเภทละครใบ้ดังนั้นเบราว์เซอร์จึงแสดงเป็นข้อความ ฉันต้องการให้ส่งไฟล์นี้เป็นไฟล์. csv เพื่อให้ผู้ใช้สามารถเปิดไฟล์ได้โดยตรงด้วย calc, excel, gnumeric และอื่น ๆ

header('Content-Type: text/csv');
echo "cell 1, cell 2";

รหัสนี้ใช้งานได้ตามที่คาดไว้ในคอมพิวเตอร์ของฉัน (ใช่หรือไม่ว่าจะเป็นอย่างไร) แต่ไม่สามารถใช้กับคอมพิวเตอร์เครื่องอื่นได้

เบราว์เซอร์ของฉันเป็นรุ่น FF 3.0.1 ทุกคืน (บน linux) เบราว์เซอร์ที่ใช้งานไม่ได้คือ IE 7 และ FF 3.0 (บน windows)

มีนิสัยใจคอที่ฉันไม่รู้บ้างไหม?

คำตอบ:


219

คุณสามารถลองบังคับให้เบราว์เซอร์เปิดกล่องโต้ตอบ "บันทึกเป็น ... " โดยทำสิ่งต่อไปนี้

header('Content-type: text/csv');
header('Content-disposition: attachment;filename=MyVerySpecial.csv');
echo "cell 1, cell 2";

ซึ่งควรใช้ได้กับเบราว์เซอร์หลัก ๆ ส่วนใหญ่


12

คุณไม่ได้ระบุภาษาหรือเฟรมเวิร์ก แต่ใช้ส่วนหัวต่อไปนี้สำหรับการดาวน์โหลดไฟล์:

"Content-Disposition: attachment; filename=abc.csv"

5

ด้วย Internet Explorer คุณมักจะต้องระบุส่วนหัว Pragma: public ด้วยเพื่อให้การดาวน์โหลดทำงานได้อย่างถูกต้อง ..

header('Pragma: public');

แค่ 2 เซ็นต์ของฉัน ..


5
Pragma: สาธารณะไม่มีความหมายใด ๆ สำหรับ Internet Explorer (ฉันทำงานกับส่วนประกอบที่เป็นปัญหาและฉันจับแหล่งที่มา)
EricLaw

อาจเป็นไปได้ว่ายูทิลิตี้ที่แท้จริงของสิ่งนี้คือการแทนที่ส่วนหัว Pragma ที่มีอยู่ก่อนหน้านี้: ไม่มีแคช?
Doin

2

รหัสนี้สามารถใช้เพื่อส่งออกไฟล์ใด ๆ รวมถึง csv

// application/octet-stream tells the browser not to try to interpret the file
header('Content-type: application/octet-stream');
header('Content-Length: ' . filesize($data));
header('Content-Disposition: attachment; filename="export.csv"');

2
"octetstream" หมายถึง "octet-stream"
EricLaw

2
สิ่งนี้อาจทำให้เกิดคำเตือนในบางเบราว์เซอร์: ทรัพยากรที่ตีความว่าเป็นเอกสาร แต่ถ่ายโอนด้วยแอปพลิเคชันประเภท MIME / octet-stream
mikeschuld
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.