PHP - Download File
Hai teman-teman yang sedang belajar PHP! Hari ini, kita akan mendalami topik yang menarik yang akan memungkinkan Anda menambahkan fungsi yang keren ke situs web Anda - mengunduh file menggunakan PHP. Sebagai guru komputer yang ramah di lingkungan sekitar Anda, saya disini untuk mengarahkan Anda melalui perjalanan ini langkah demi langkah. Jadi, ambil minuman favorit Anda, duduk nyaman, dan mari kita mulai mengoding!
Fungsi readfile()
Pusat dari pengunduhan file dalam PHP adalah fungsi readfile()
. Fungsi kecil yang handal ini adalah alat utama Anda saat Anda ingin membaca file dan menulis isiannya ke buffer output. Jangan khawatir jika itu terdengar teknis - kita akan membongkar itu bersama-sama!
Penggunaan Dasar
Mari kita mulai dengan contoh sederhana:
<?php
readfile("example.txt");
?>
Dalam contoh kode ini, readfile()
membaca isi "example.txt" dan mengoutputkannya langsung ke browser. Itu seperti magis - isi file muncul di layar Anda!
Mengunduh File
Sekarang, mari kita lihat bagaimana cara mengunduh file. Mari kita lihat contoh yang lebih lengkap:
<?php
$file = "myfile.pdf";
if(file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
exit;
}
?>
Wah, itu cukup banyak untuk diambil! Mari kitauraikan:
- Kita menentukan file yang ingin kita unduh (
$file = "myfile.pdf"
). - Kita memeriksa jika file itu ada menggunakan
file_exists()
. - Jika ada, kita mengatur beberapa header:
-
Content-Description
memberitahu browser ini adalah transfer file. -
Content-Type
mengatur jenis MIME ke file biner umum. -
Content-Disposition
meminta browser untuk mengunduh file. - Header lainnya memastikan file tidak disembunyikan dan dikelola dengan benar.
- Akhirnya, kita gunakan
readfile()
untuk outputkan isi file.
Tipe File Umum
Tipe file yang berbeda mungkin memerlukan header yang berbeda. Berikut adalah tabel praktis dari tipe file umum dan header Content-Type
yang sesuai:
Tipe File | Header Content-Type |
---|---|
application/pdf | |
ZIP | application/zip |
JPEG | image/jpeg |
PNG | image/png |
MP3 | audio/mpeg |
MP4 | video/mp4 |
Membuat Tautan Unduh
Sekarang kita tahu bagaimana memicu pengunduhan, mari kita buat tautan unduh yang ramah pengguna:
<!DOCTYPE html>
<html>
<body>
<h2>Unduh File</h2>
<p><a href="download.php?file=myfile.pdf">Unduh PDF</a></p>
</body>
</html>
Dalam HTML ini, kita membuat tautan ke skrip PHP (download.php
) yang akan mengelola pengunduhan file. Kita kirim nama file sebagai parameter di URL.
Sekarang, mari kita buat skrip download.php
:
<?php
if(isset($_GET['file'])) {
$file = $_GET['file'];
$filepath = "uploads/" . $file;
if(file_exists($filepath)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($filepath).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filepath));
readfile($filepath);
exit;
} else {
echo "File tidak ditemukan.";
}
}
?>
Skrip ini melakukan hal berikut:
- Memeriksa jika parameter file diberikan di URL.
- Membangun path file lengkap (dengan asumsi file berada di direktori "uploads").
- Jika file ada, mengatur header dan memicu pengunduhan.
- Jika file tidak ada, menampilkan pesan kesalahan.
Pertimbangan Keselamatan
Sekarang, saya tahu apa yang Anda pikirkan - "Tapi guru, isn't ini agak berisiko? Apa bila seseorang mencoba mengunduh file yang mereka seharusnya tidak?" Pertanyaan yang bagus! Anda sungguh benar, dan itu adalah sebabnya kita perlu membicarakan tentang keselamatan.
Validasi Path File
Kita tidak pernah dapat mempercayai input pengguna secara langsung. Berikut adalah versi yang diperbaiki dari skrip unduhan kami:
<?php
if(isset($_GET['file'])) {
$file = basename($_GET['file']);
$filepath = "uploads/" . $file;
// Validasi path file
$realPath = realpath($filepath);
$uploadDir = realpath("uploads/");
if($realPath === false || strpos($realPath, $uploadDir) !== 0) {
die("Path file tidak valid.");
}
if(file_exists($filepath)) {
// ... (sisa kode pengunduhan)
} else {
echo "File tidak ditemukan.";
}
}
?>
Dalam versi ini:
- Kita gunakan
basename()
untuk menghapusupaya traversal direktori. - Kita gunakan
realpath()
untuk mendapatkan path aktual file dan direktori uploads. - Kita memeriksa jika path aktual file dimulai dengan path direktori uploads, memastikan kita tidak mengakses file di luar direktori yang diinginkan.
Kesimpulan
Dan begitulah, teman-teman! Kita telah berpergian melalui negeri pengunduhan file PHP, dari dasar readfile()
ke membuat tautan unduh, dan bahkan menyentuh beberapa pertimbangan keselamatan. Ingat, dengan kekuatan yang besar datang tanggung jawab yang besar - selalu validasi input pengguna dan pikirkan keselamatan saat bekerja dengan pengunduhan file.
Saya harap Anda menikmati pelajaran ini seolah-olah saya menikmati mengajarnya. Teruslatihan, terus mengoding, dan sebelum Anda sadar, Anda akan membuat aplikasi PHP yang menakjubkan dengan berbagai fitur unduh yang keren. Sampai jumpa lagi, selamat coding!
Credits: Image by storyset