ในการทำ website ถ้าหากว่าเรามีข้อมูลที่ต้องการให้ download อย่างเช่น file .pdf หรือ file .doc เราสามารถทำการสร้าง link ไปที่ file เหล่านั้นได้โดยตรง แต่ว่าเราจะไม่สามารถทำการ ตรวจสอบได้เลยว่า file ไหนถูก download ไปเท่าไรแล้ว และยิ่งกว่านั้นหากว่าเป็น file พวก .pdf ด้วยแล้ว browser อาจจะไม่ขึ้นหน้าต่างให้ save แต่จะเปิด pdf ให้ที่หน้า browser เลยก็ได้ ซึ่งหากว่าเป็นผู้ที่ใช้ internet หน้าใหม่ด้วยแล้วอาจจะหยุดหงิดได้ง่ายๆ และผู้ใช้ยังเห็นด้วยว่าเราเก็บ file ไว้ที่ folder อะไร
วันนี้เราจะมาหัดเขียนโปรแกรม download ที่สามารถเช็คได้ว่า file ไหนถูก download ไปเท่าไรแล้ว และในการ download แต่ละครั้ง เราก็จะกำหนดให้ผู้ใช้ทำการ download และ save ลงเครื่องก่อนเท่านั้น และวิธีการนี้ผู้ที่ทำการ download เองก็จะไม่ทราบด้วยว่าเราเก็บ file จริงๆ ไว้ที่ folder อะไร ของ server
มาดูวิธีการกันเลย
ใน ตัวอย่างต่อไปนี้เราจะกำหนดให้ file ที่จะให้ download อยู่ใน folder /downloads/ โดย file ที่ผมจะทำการทดทองจะชื่อ test.html ซึ่งเป็น file HTML ธรรมดา ซึ่งภายใน file test.html มีข้อมูลดังนี้
test.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <HTML> <HEAD> <TITLE> Test Download </TITLE> </HEAD> <BODY> <h2>Test Download</h2> <h2>Test Download</h2> <h2>Test Download</h2> <h2>Test Download</h2> <h2>Test Download</h2> <h2>Test Download</h2> <h2>Test Download</h2> <h2>Test Download</h2> <h2>Test Download</h2> <h2>Test Download</h2> </BODY> </HTML> |
ที่ผมเลือกทดสอบกับ file .html ก็เพื่อจะแสดงให้เห็นว่าการทำเป็น link ธรรมดากับการที่เราจะทำโปรแกรมเพื่อทำการ download มันต่างกัน จริงๆ และตัว file .html ก็เป็นตัวอย่างที่ดี เพราะว่าเวลาเราเรียก test.html ขึ้นมาตรงๆ ก็จะเป็นการเปิดหน้านั้นขึ้นมาที่ browser เลย ไม่สามารถที่จะ save ได้ (ยกเว้นว่า ผู้ใช้จะไปกด save จาก menu ของ browser อีกที)
ทีนี้มาดูกันว่า หากว่าเป็นวิธีการปกติที่เราใช้กันเราก็จะเขียน code html เพื่อ link ไปยัง file test.html นั้นเลย แบบนี้
1 | <a href="./downloads/test.html">Download</a> |
ซึ่งจากตัวอย่างเมื่อเราทำการ คลิกที่ link ก็จะเป็นการเปิดหน้า test.html ขึ้นมา และผู้ใช้ก็ยังเห็นด้วย ว่าเราเก็บ file test.html ไว้ที่ไหน
ต่อไปมาดูตัวอย่างโปรแกรม download กันดีกว่า
download.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php $file = str_replace("..", "", $file); $file = str_replace("/", "", $file); // ทำการ replace ตัว .. และตัว / ออกจากชื่อ file ที่จะทำการ download // เพราะว่าจะมีพวกมือบอลเข้ามา และพยายามจะ download file อื่นที่อยู่นอก folder ที่เรากำหนดไว้ // อย่างเช่น เขาอาจจะใส่ว่า ../download.php เข้ามาอะไรแบบนี้ อันตรายจริงๆๆ ต้องระวัง if(is_file("./downloads/".$file)){ // ตรวจสอบอีกครั้งว่ามี file นี้อยู่จริงๆ mysql_connect("localhost", "root", "root"); mysql_select_db("test_download"); $query = "INSERT INTO `download` ( `ID` , `FILE` , `DATE` ) VALUES ('', '$file',NOW())"; $result = mysql_query($query); // ทำาการ insert ข้อมูลการ download ลง database โดยจะเก็บ ชื่อ file และเวลาที่เข้ามาทำการ download header("Content-Description: File Transfer"); header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=".$file); @readfile("./downloads/".$file); // ระบุ folder ที่เก็บ file } exit; ?> |
เมื่อได้โปรแกรม download.php แล้วต่อไปเรามาลองเรียกใช้กันดูบ้าง โดยให้ทำการสร้าง link เพื่อ download file test.html ดังนี้
1 | <a href="download.php?file=test.html">Download</a> |
จากนั้นก็ลอง คลิก Download ได้เลย
คำแนะนำ อย่าพยายามนำ file download.php ไปไว้ใน folder เดี่ยวกันกับ file ที่ต้องการให้ download เพราะผู้ที่ download อาจจะทำการใส่ parameter เป็น file=download.php เข้ามาได้ ฉะนั้นระวังๆ เวลาเขียนโปรแกรมด้วยนะครับ ตรวจสอบ path อะไรต่างๆให้ดี และจากตัวอย่าง download.php ผมใส่ ./downloads ก็เพราะว่า โปรแกรม download.php ของผมอยู่ที่เดี่ยวกันกับ folder downloads
แต่ถ้าหากว่าของคุณอยู่ใน folder ที่สูงกว่า download.php ขึ้นไปอีกก็ใช้เป็น ../downloads นะครับ