PHP File Download: Memaksa Unduhan File

Kadang kita ingin memaksa browser mengunduh sebuah file alih-alih menampilkannya — misalnya file PDF, ZIP, atau gambar yang aksesnya dibatasi hanya untuk pengguna terdaftar. Teknik PHP File Download memberi Anda kendali penuh atas proses unduhan ini.

Mengapa Mengunduh Lewat PHP?

Jika file diletakkan di folder publik, siapa pun bisa mengaksesnya langsung lewat URL. Dengan menyalurkan unduhan melalui PHP, Anda bisa: memeriksa apakah pengguna sudah login, mencatat jumlah unduhan, atau menyimpan file di luar folder publik agar lebih aman.

Konsep Dasar: Header HTTP

Kunci dari force download adalah mengirim header HTTP yang tepat sebelum menampilkan isi file. Header inilah yang memberi tahu browser untuk mengunduh, bukan menampilkan:

<?php
$file = "dokumen.pdf";

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"" . basename($file) . "\"");
header("Content-Length: " . filesize($file));
readfile($file); // mengalirkan isi file ke browser
exit;
?>

Mari kita pahami setiap header: Content-Type menandai file sebagai data biner, Content-Disposition: attachment memerintahkan unduhan, dan Content-Length memberi tahu ukuran file agar progress bar muncul.

Contoh dengan Pengecekan Login

<?php
session_start();
if (!isset($_SESSION["login"])) {
    die("Anda harus login untuk mengunduh.");
}

$file = "private/ebook.pdf";
if (file_exists($file)) {
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"" . basename($file) . "\"");
    header("Content-Length: " . filesize($file));
    readfile($file);
    exit;
}
?>

Menjaga Keamanan dari Directory Traversal

Jangan pernah memasukkan nama file langsung dari input pengguna. Jika Anda menulis readfile($_GET["file"]), penyerang bisa meminta ../../wp-config.php dan mencuri file rahasia. Selalu gunakan whitelist atau ID:

<?php
$daftar = ["1" => "ebook.pdf", "2" => "template.zip"];
$id = $_GET["id"] ?? "";
if (isset($daftar[$id])) {
    $file = "private/" . $daftar[$id];
    // ... proses download
}
?>

Kesalahan Umum

  • Ada output sebelum header. Spasi atau echo sebelum header() menyebabkan error “headers already sent”.
  • Memakai nama file dari input mentah, membuka celah directory traversal.

Kesimpulan

Teknik PHP File Download memberi Anda kontrol penuh atas siapa yang boleh mengunduh dan file mana yang tersedia. Pastikan tidak ada output sebelum header dan selalu batasi file yang bisa diakses lewat whitelist demi keamanan.

Referensi: untuk penjelasan lebih mendalam, kunjungi dokumentasi resmi PHP (php.net).

Baca Juga

Ali Akbar

Software Developer yang fokus mengembangkan aplikasi berbasis Web dan Desktop. Senang mempelajari teknologi baru terutama di bidang web design dan web development.

View all posts by Ali Akbar →

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *