Downloader by PHP header function

หาคำสั่ง PHP ในการส่งไฟล์ออกมาจากเว็บ โดยไม่ให้เว็บเบราเซอร์แสดงผล

โจทย์คือ ถ้าคลิกลิงก์ไฟล์ที่เป็น .doc ใน IE (Windows) มันก็จะเรียกตัวทูลของ MS Word มาแสดงผลซ้อนเข้าไปใน IE ซึ่งผมไม่ต้องการให้มันแสดงผลแบบนั้น แต่อยากให้มันส่งไฟล์ออกมาเลย โดยมีหน้าต่างขึ้นมาถามว่าจะ Open หรือ Save

หลังจากที่ถามใน codenone.com และ หาเพิ่มจาก google ได้ความว่าใช้ฟังก์ชั่น header ใน php ในการส่งไฟล์ออกมาดังกล่าว

สรุปได้ดังนี้...

----
$file = "yourfile.doc";
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename=' . basename($file));
readfile($file);
----

และ sugree ได้อธิบายเพิ่มในกระทู้ว่า

Content-Type _ บอกชนิดของไฟล์ browser จะได้เปิดถูก
Content-Length _ บอกขนาดของไฟล์ เอาไว้แสดง progressbar ไม่ใส่ก็ได้
Content-Disposition _ เอาไว้บอกชื่อไฟล์ เวลากด save as จะได้ไม่เป็น download.php มี 2 โหมด inline กับ attachment, ถ้าเป็น inline มันอาจจะโผล่ใน browser แต่ถ้า attachment จะเปิดด้วยโปรแกรมข้างนอกหรือ save as



Comments

ezy

กำลังเล่นกับการ Response แบบนี้อยู่พอดี (ตอนนี้ทำ .NET)

กำลังสงสัยว่าถ้าไม่กำหนด Length นี่มันก็ยอมใช่ไหม? (ผมต้อง Generate ZIP ทางฝั่ง Server เพื่อตอบกลับ Client แบบ On demand ซึ่งการมาตรวจขนาดของ Bytes ที่จะส่งกลับไปเหมือนจะสร้างภาระให้กับ Server มากเกินจำเป็น)

Poakpong

ตรง Content-Length เค้าบอกว่าไม่ต้องใส่ก็ได้
ผมเข้าใจว่า เวลาใช้งานจริงมันก็คงดาวน์โหลดได้ปกติ แต่เป็นแบบ Unknow File Size ครับ

the DtTvB

Content-Length ใส่ไว้ดีกว่าครับ ถ้าหากเป็นไฟล์ที่ Generate ขึ้นมาลอยๆ แล้วไม่รู้ขนาดสามารถใช้ ob_start() ได้ครับ ปกติผมมักใส่ไว้ครับ โดยเฉพาะไฟล์ใหญ่ๆ จะได้มีความหวังว่าจะโหลดเสร็จเมื่อไร

Content-Type ผมเห็นบางเว็บใส่เป็น application/force-download เป็นทางออกอีกทางครับ แต่ไม่แนะนำ เป็นอะไรก็ใส่ไปซะดีกว่า

โค้ด ' header('Content-Disposition: attachment; filename=' . basename($file)); '
อาจจะมีปัญหาเวลาชื่อไฟล์มีตัวเว้นวรรคครับ
น่าจะเป็น

header('Content-Disposition: attachment; filename="' . basename($file) . '"');

มากกว่าครับ