Jump to: navigation, Search
Poakpong.com ปกป้อง ดอมคอม Life is random

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

Permanent Link: Poakpong's Blog [www.poakpong.com/1111]

Recent posts in "Mac Stuff"
Comments

Submitted by ezy on 2008-03-13 21:04:36 (IP: 58.9.205.xxx)

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

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

Submitted by Poakpong on 2008-03-14 09:43:40 (IP: 58.8.101.xxx)

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

Submitted by the DtTvB on 2008-03-18 23:27:40 (IP: 124.121.227.xxx)

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

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

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

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

มากกว่าครับ

*

*

(Optional) Hide away from publicly.

(Optional)

* (Plain text only)

(Maximum characters: 1000)
characters left.

Your IP: 38.103.63.xxx

To support Thai language in iPod.

Inside Poakpong.com
มีอะไรใน ปกป้อง ดอทคอม

Subscribe RSS Feed

Recent All Posts

Poakpong's Playground

Copyright Notice

POAKPONG.com,
Update to 2008.

Creative Commons License
This work is licensed under a Creative Commons Attribution 3.0 License.

Our Network:

Create in Mac OS X

Search in Poakpong
ค้นหาใน ปกป้อง ดอทคอม



Advertising

เปิดเนต เปิดใจ
ปกป้องเสรีภาพของเรา
บนอินเทอร์เน็ตของเรา
(ร่วมลงชื่อในแถลงการณ์)

Web Links

SEO Stats powered by MyPagerank.Net