PHP - Muat Turun Fail

Hai there, para pengembang PHP yang ambisius! Hari ini, kita akan melihat sebuah topik yang menarik yang akan memungkinkan Anda menambahkan fungsi yang menarik ke situs web Anda - pengunduhan fail menggunakan PHP. Sebagai guru komputer tetangga yang ramah, saya di sini untuk mengorbit Anda dalam perjalanan ini langkah demi langkah. Jadi, ambil minuman kesukaan Anda, duduk dengan nyaman, dan mari kita mulai mengoding!

PHP - Download File

Fungsi readfile()

Pusat dari pengunduhan fail di PHP adalah fungsi readfile(). Fungsi kecil yang handal ini adalah alat utama Anda saat Anda ingin membaca fail dan menulis isiannya ke buffer output. Jangan khawatir jika itu terdengar teknis - kita akan membongkar itu bersama!

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 peramban. Itu seperti magis - isi fail muncul di layar Anda!

Pengunduhan Fail

Sekarang, mari kita lihat bagaimana kita bisa menggunakan readfile() untuk meminta pengunduhan fail. 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 banyak sekali! Mari kitauraikan itu:

  1. Kita menentukan fail yang ingin kita unduh ($file = "myfile.pdf").
  2. Kita memeriksa jika fail itu ada menggunakan file_exists().
  3. Jika ada, kita mengatur serangkaian header:
  • Content-Description memberitahu peramban ini adalah transfer fail.
  • Content-Type menetapkan jenis MIME ke file biner umum.
  • Content-Disposition meminta peramban untuk mengunduh file.
  • Header lainnya memastikan file tidak disembunyikan dan diperlakukan dengan benar.
  1. Akhirnya, kita menggunakan readfile() untuk mengoutputkan isi file.

Jenis File Umum

Jenis file yang berbeda mungkin memerlukan header yang berbeda. Ini adalah tabel praktis dari jenis file umum dan header Content-Type yang sesuai:

Jenis File Header Content-Type
PDF application/pdf
ZIP application/zip
JPEG image/jpeg
PNG image/png
MP3 audio/mpeg
MP4 video/mp4

Membuat Tautan Unduhan

Sekarang kita tahu bagaimana memicu pengunduhan, mari kita buat tautan unduhan yang ramah pengguna:

<!DOCTYPE html>
<html>
<body>

<h2>Unduh Fail</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 menangani pengunduhan file. Kita kirim nama file sebagai parameter dalam 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:

  1. Memeriksa jika parameter file dilewatkan dalam URL.
  2. Membangun path file lengkap (dengan asumsi file berada di direktori "uploads").
  3. Jika file ada, ia mengatur header dan memicu pengunduhan.
  4. Jika file tidak ada, ia menampilkan pesan kesalahan.

Pertimbangan Keselamatan

Sekarang, saya tahu apa yang Anda pikirkan - "Tapi gurunya, isn't ini agak berisiko? Apa bila seseorang mencoba mengunduh file yang mereka seharusnya tidak?" Pertanyaan yang bagus! Anda benar, dan itu adalah sebabnya kita perlu membicarakan keselamatan.

Validasi Path File

Kita tidak pernah boleh mempercayai input pengguna secara langsung. Ini 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:

  1. Kita gunakan basename() untuk menghapusupaya penelusuran direktori.
  2. Kita gunakan realpath() untuk mendapatkan path aktual file dan direktori uploads.
  3. Kita memeriksa jika path aktual file dimulai dengan path direktori uploads, memastikan kita tidak mengakses file di luar direktori yang dimaksud.

Kesimpulan

Dan begitu saja, teman-teman! Kita telah melintasi negeri pengunduhan file PHP, dari dasar readfile() ke membuat tautan unduhan 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. Terus latihan, terus mengoding, dan sebelum Anda tahu, Anda akan menciptakan aplikasi PHP yang menakjubkan dengan berbagai fitur unduhan yang menarik. Sampai jumpa lagi, coding yang menyenangkan!

Credits: Image by storyset