เขียนโปรแกรม downloads ไว้ใช้เองหน่อยไหม
![](https://www.unzeen.com/wp-content/uploads/logo/php.jpg)
วันนี้เราจะมาหัดเขียนโปรแกรม 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> |
ทีนี้มาดูกันว่า หากว่าเป็นวิธีการปกติที่เราใช้กันเราก็จะเขียน code html เพื่อ link ไปยัง file test.html นั้นเลย แบบนี้
1 | <a href="./downloads/test.html">Download</a> |
ต่อไปมาดูตัวอย่างโปรแกรม 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; ?> |
1 | <a href="download.php?file=test.html">Download</a> |
คำแนะนำ อย่าพยายามนำ file download.php ไปไว้ใน folder เดี่ยวกันกับ file ที่ต้องการให้ download เพราะผู้ที่ download อาจจะทำการใส่ parameter เป็น file=download.php เข้ามาได้ ฉะนั้นระวังๆ เวลาเขียนโปรแกรมด้วยนะครับ ตรวจสอบ path อะไรต่างๆให้ดี และจากตัวอย่าง download.php ผมใส่ ./downloads ก็เพราะว่า โปรแกรม download.php ของผมอยู่ที่เดี่ยวกันกับ folder downloads
แต่ถ้าหากว่าของคุณอยู่ใน folder ที่สูงกว่า download.php ขึ้นไปอีกก็ใช้เป็น ../downloads นะครับ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น