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).

