Menangani Unggahan File
Proses file yang diunggah dengan aman menggunakan superglobal _FILES.
Menangani Unggahan File adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.
Ikhtisar Unggahan Berkas PHP
PHP menangani unggahan berkas melalui superglobal $_FILES. Formulir harus menggunakan method="POST" dan enctype="multipart/form-data".
Formulir Unggah HTML
Penyiapan formulir HTML untuk unggahan satu atau beberapa berkas:
<!-- Single file -->
<form method="POST" action="upload.php"
enctype="multipart/form-data">
<input type="file" name="document">
<button>Upload</button>
</form>
<!-- Multiple files -->
<form method="POST" enctype="multipart/form-data">
<input type="file" name="photos[]" multiple>
<button>Upload All</button>
</form>Struktur $_FILES
Setiap berkas yang diunggah memiliki lima entri dalam $_FILES:
<?php
$file = $_FILES['document'];
echo $file['name']; // original name: report.pdf
echo $file['type']; // browser-reported MIME: application/pdf
echo $file['tmp_name']; // server temp path: /tmp/phpXXXXXX
echo $file['error']; // error code: 0 = UPLOAD_ERR_OK
echo $file['size']; // file size in bytesKode Kesalahan Unggahan
Selalu periksa $file['error'] sebelum memprosesnya:
<?php
$errorMessages = [
UPLOAD_ERR_INI_SIZE => 'Exceeds upload_max_filesize in php.ini',
UPLOAD_ERR_FORM_SIZE => 'Exceeds MAX_FILE_SIZE in form',
UPLOAD_ERR_PARTIAL => 'Only partially uploaded',
UPLOAD_ERR_NO_FILE => 'No file uploaded',
UPLOAD_ERR_NO_TMP_DIR => 'Missing temp folder',
UPLOAD_ERR_CANT_WRITE => 'Failed to write to disk',
UPLOAD_ERR_EXTENSION => 'PHP extension stopped upload',
];
$err = $_FILES['doc']['error'];
if ($err !== UPLOAD_ERR_OK) {
die($errorMessages[$err] ?? 'Unknown error');
}Memvalidasi Tipe Berkas dengan Aman
Jangan pernah memercayai tipe MIME yang diberikan peramban — verifikasi dengan isi berkas sebenarnya:
<?php
$tmp = $_FILES['image']['tmp_name'];
$allowed = ['image/jpeg', 'image/png', 'image/webp'];
// Check real MIME type from file content
$realMime = mime_content_type($tmp);
if (!in_array($realMime, $allowed)) {
die('Invalid file type: ' . $realMime);
}Memvalidasi Ukuran Berkas
Tetapkan batas ukuran di sisi server meskipun formulir HTML memiliki bidang tersembunyi MAX_FILE_SIZE:
<?php
$maxBytes = 5 * 1024 * 1024; // 5MB
$size = $_FILES['video']['size'];
if ($size > $maxBytes) {
$mb = round($size / 1024 / 1024, 2);
die("File too large: {$mb}MB (max 5MB)");
}is_uploaded_file dan move_uploaded_file
Selalu gunakan kedua fungsi ini untuk memastikan berkas berasal dari unggahan HTTP dan memindahkannya dengan aman:
<?php
$tmp = $_FILES['photo']['tmp_name'];
$dest = '/var/www/uploads/' . basename($_FILES['photo']['name']);
if (!is_uploaded_file($tmp)) {
die('Not an uploaded file — possible attack');
}
if (!move_uploaded_file($tmp, $dest)) {
die('Failed to move uploaded file');
}
echo 'Upload saved to: ' . $dest;Membuat Nama Berkas yang Aman
Buat nama berkas acak untuk mencegah serangan traversal direktori dan penimpaan berkas:
<?php
$originalName = $_FILES['doc']['name'];
$ext = strtolower(pathinfo($originalName, PATHINFO_EXTENSION));
$allowedExts = ['jpg', 'jpeg', 'png', 'pdf'];
if (!in_array($ext, $allowedExts)) {
die('File type not allowed');
}
$safeName = bin2hex(random_bytes(16)) . '.' . $ext;
$dest = '/var/www/uploads/' . $safeName;
move_uploaded_file($_FILES['doc']['tmp_name'], $dest);Menangani Beberapa Unggahan Berkas
Saat menggunakan name="photos[]", $_FILES berisi array — lakukan iterasi pada array tersebut:
<?php
$files = $_FILES['photos'];
$count = count($files['name']);
for ($i = 0; $i < $count; $i++) {
if ($files['error'][$i] !== UPLOAD_ERR_OK) continue;
$tmp = $files['tmp_name'][$i];
$ext = pathinfo($files['name'][$i], PATHINFO_EXTENSION);
$dest = '/uploads/' . uniqid() . '.' . strtolower($ext);
move_uploaded_file($tmp, $dest);
echo "Saved: $dest" . PHP_EOL;
}Pengaturan Unggahan php.ini
Direktif php.ini utama yang memengaruhi unggahan berkas:
file_uploads = On— mengaktifkan unggahanupload_max_filesize = 8M— ukuran maksimum satu berkaspost_max_size = 32M— ukuran maksimum isi POST (harus > upload_max_filesize)max_file_uploads = 20— jumlah maksimum berkas per permintaan
Mengubah Ukuran Gambar Setelah Diunggah
Gunakan pustaka GD untuk mengubah ukuran gambar setelah diunggah:
<?php
function resizeImage(string $src, string $dst, int $maxW): void {
[$w, $h, $type] = getimagesize($src);
$ratio = $maxW / $w;
$newH = (int) ($h * $ratio);
$srcImg = imagecreatefromjpeg($src);
$dstImg = imagecreatetruecolor($maxW, $newH);
imagecopyresampled($dstImg, $srcImg, 0,0,0,0, $maxW, $newH, $w, $h);
imagejpeg($dstImg, $dst, 90);
imagedestroy($srcImg);
imagedestroy($dstImg);
}Pemeriksaan Singkat
Fungsi PHP mana yang diperlukan untuk memindahkan berkas yang diunggah dengan aman ke tujuan akhirnya?
Rangkuman: Unggahan Berkas
Daftar periksa penanganan unggahan:
- Formulir harus menggunakan
method=POST enctype=multipart/form-data - Periksa
$_FILES['field']['error'] === UPLOAD_ERR_OK - Validasi tipe MIME sebenarnya dengan
mime_content_type() - Validasi ukuran berkas di sisi server
- Gunakan
move_uploaded_file()— bukan rename/copy - Buat nama berkas acak untuk mencegah konflik
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menangani Unggahan File” gratis?
Ya — teks lengkap “Menangani Unggahan File” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Menangani Unggahan File”?
Proses file yang diunggah dengan aman menggunakan superglobal _FILES. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai PHP Academy?
Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Menangani Unggahan File” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Membaca File dengan PHP
- Menulis dan Menambahkan Isi ke File
- Mengelola Direktori
- Menangani Unggahan File