สร้างลิงค์สำหรับดาวน์โหลดไฟล์
ปกติแล้วเมื่อมีการสร้างลิงค์ ไปยังไฟล์ เช่น ไฟล์รูปภาพ หรือไฟล์ txt ตัวบราวเซอร์เองเมื่อได้รับลิงค์นั้นๆจะไปทำการเรียกโปรแกรมที่ลงทะเบียนไว้กับระบบปฏิบัติการเพื่อเปิดไฟล์นั้นๆ ดังนั้นโดยทั่วๆไปเราจึงไม่สามารถบันทึกไฟล์เหล่านั้นลงบนคอมพิวเตอร์โดยตรง นอกจากจะเปิดมันขึ้นมาก่อน แล้วค่อยสั่งบันทึก
ใน PHP เราสามารถเขียนคำสั่ง เพื่อดาวน์โหลดไฟล์ที่ต้องการได้ครับ ด้วยการเขียนคำสั่งของ PHP เพื่อเรียกไฟล์ และ กำหนด Header ให้บราวเซอร์รู้ว่าเป็นการดาวน์โหลด
อธิบายโค้ดด้านบน
เป็นการส่ง Header เพื่อบอก PHP ให้ทำการดาวน์โหลดไฟล์
ตัวแปร $download จะระบุแค่ชื่อไฟล์นะครับ ไม่ต้องระบุ path เช่น download.png
ส่วนตัวแปร $path จะระบุ path ที่เก็บไฟล์ที่จะดาวน์โหลด ไม่ต้องมี / ต่อท้าย เพราะในโปรแกรมเติมให้แล้ว เช่น /var/www/html
สำคัญมากสำหรับการดาวน์โหลดแบบนี้ จะต้องระบุเงื่อนไขของไฟล์ให้ชัดเจน ไม่ควรมี ../ ในชื่อไฟล์เด็ดขาด ตามตัวอย่าง ผมอนุญาตให้ดาวน์โหลดเฉพาะไฟล์รูปภาพเท่านั้น และชื่อไฟล์ต้องเป็นภาษาตัวอังกฤษตัวพิมพ์เล็ก
ตัวอย่างการใช้งาน
โค้ดด้านบนเป็นตัวอย่างการนำไปใช้งาน
ใน PHP เราสามารถเขียนคำสั่ง เพื่อดาวน์โหลดไฟล์ที่ต้องการได้ครับ ด้วยการเขียนคำสั่งของ PHP เพื่อเรียกไฟล์ และ กำหนด Header ให้บราวเซอร์รู้ว่าเป็นการดาวน์โหลด
<?php
// download.php
if (isset($_GET['download'])) {
// รับค่ามาจากการคลิกที่ Link
$download = (string) $_GET['download'];
// path ที่เก็บไฟล์
$path_to_file = ".";
// ตัวอย่างนี้อนุญาตให้ดาวน์โหลดไฟล์รูปภาพ แทนการเปิดดูไฟล์
// ถ้าต้องการดาวน์โหลดไฟล์อื่นให้ระบุเงื่อนไขของ preg_match ให้ชัดเจน เพื่อความปลอดภัย
if (preg_match('/^[a-z]+\.(jpg|png|jpeg|gif)$/', $download) && is_file("$path/$download")) {
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=$download");
@readfile("$path_to_file/$download");
}
}
?>
อธิบายโค้ดด้านบน
header("Content-Type: application/force-download");
เป็นการส่ง Header เพื่อบอก PHP ให้ทำการดาวน์โหลดไฟล์
header("Content-Disposition: attachment; filename=$download");
ตัวแปร $download จะระบุแค่ชื่อไฟล์นะครับ ไม่ต้องระบุ path เช่น download.png
@readfile("$path/$download");
ส่วนตัวแปร $path จะระบุ path ที่เก็บไฟล์ที่จะดาวน์โหลด ไม่ต้องมี / ต่อท้าย เพราะในโปรแกรมเติมให้แล้ว เช่น /var/www/html
preg_match('/^[a-z]+\.(jpg|png|jpeg|gif)$/', $download)
สำคัญมากสำหรับการดาวน์โหลดแบบนี้ จะต้องระบุเงื่อนไขของไฟล์ให้ชัดเจน ไม่ควรมี ../ ในชื่อไฟล์เด็ดขาด ตามตัวอย่าง ผมอนุญาตให้ดาวน์โหลดเฉพาะไฟล์รูปภาพเท่านั้น และชื่อไฟล์ต้องเป็นภาษาตัวอังกฤษตัวพิมพ์เล็ก
ตัวอย่างการใช้งาน
<a href=download.php?download=download.png>ดาวน์โหลด</a>
โค้ดด้านบนเป็นตัวอย่างการนำไปใช้งาน