สร้างลิงค์สำหรับดาวน์โหลดไฟล์

ปกติแล้วเมื่อมีการสร้างลิงค์ ไปยังไฟล์ เช่น ไฟล์รูปภาพ หรือไฟล์ txt ตัวบราวเซอร์เองเมื่อได้รับลิงค์นั้นๆจะไปทำการเรียกโปรแกรมที่ลงทะเบียนไว้กับระบบปฏิบัติการเพื่อเปิดไฟล์นั้นๆ ดังนั้นโดยทั่วๆไปเราจึงไม่สามารถบันทึกไฟล์เหล่านั้นลงบนคอมพิวเตอร์โดยตรง นอกจากจะเปิดมันขึ้นมาก่อน แล้วค่อยสั่งบันทึก

ใน 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>

โค้ดด้านบนเป็นตัวอย่างการนำไปใช้งาน
ผู้เขียน goragod โพสต์เมื่อ 01 เม.ย. 2551 เปิดดู 35,744 ป้ายกำกับ PHP
^