Upload File Dasar
Terima file dari user: form enctype, $_FILES, dan move_uploaded_file.
Kenapa Upload Perlu Cara Khusus?
Form biasa mengirim teks sebagai pasangan nama=nilai. File biner (foto, PDF) tidak bisa dikirim begitu: ia butuh encoding khusus (multipart/form-data) dan PHP menampungnya di array spesial $_FILES, bukan $_POST. Tanpa enctype yang benar di form, file tidak akan pernah sampai.
<?php
// Contoh 1: form upload paling sederhana
?>
<form method="post" enctype="multipart/form-data">
<input type="file" name="foto">
<button>Upload</button>
</form>
<?php
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_FILES["foto"])) {
$f = $_FILES["foto"];
echo "Nama asli: " . $f["name"] . "<br>";
echo "Ukuran: " . $f["size"] . " byte<br>";
echo "Tipe: " . $f["type"] . "<br>";
echo "Error: " . $f["error"]; // 0 = sukses (UPLOAD_ERR_OK)
}$_FILES["foto"] adalah array dengan 5 kunci: name (nama asli), type (klaim browser), size (byte), tmp_name (lokasi sementara di server), error (kode status). File yang diupload mendarat dulu di folder sementara; kalau tidak dipindah, PHP menghapusnya saat request selesai.
<?php
// Contoh 2: memindahkan file ke folder tujuan
$tujuan = "uploads/" . basename($_FILES["foto"]["name"]);
if ($_FILES["foto"]["error"] === UPLOAD_ERR_OK) {
if (!is_dir("uploads")) {
mkdir("uploads", 0755, true); // buat folder jika belum ada
}
if (move_uploaded_file($_FILES["foto"]["tmp_name"], $tujuan)) {
echo "Upload berhasil: $tujuan";
} else {
echo "Gagal memindahkan file.";
}
}move_uploaded_file() adalah satu-satunya cara yang benar memindahkan file upload: ia sekaligus memastikan file memang berasal dari upload HTTP (bukan file sistem yang dimanipulasi). Jangan pernah pakai copy() atau rename() untuk file upload.
Jebakan yang Sering Terjadi
Lupa enctype="multipart/form-data". Tanpa atribut ini, $_FILES kosong dan file tidak terkirim, tanpa pesan error yang jelas. Ini penyebab nomor satu "upload tidak jalan" pada pemula. Selalu pasang saat ada <input type="file">.
Percaya $f["type"] dari browser. Nilai type dikirim oleh browser dan bisa dipalsukan (file .php bisa mengaku image/jpeg). Untuk validasi tipe yang serius, periksa isi file di server dengan finfo atau getimagesize() (dibahas di modul upload aman).
Upload Banyak File Sekaligus
Atribut multiple + nama array menangani banyak file:
<?php
// HTML: <input type="file" name="galeri[]" multiple>
?>
<?php
// Struktur $_FILES untuk multiple BERBEDA: dikelompokkan per kunci!
foreach ($_FILES["galeri"]["name"] as $i => $nama) {
if ($_FILES["galeri"]["error"][$i] !== UPLOAD_ERR_OK) continue;
$tmp = $_FILES["galeri"]["tmp_name"][$i];
$tujuan = "uploads/" . basename($nama);
move_uploaded_file($tmp, $tujuan);
echo "OK: $nama\n";
}Jebakan: untuk name="galeri[]", $_FILES["galeri"]["name"] adalah array, bukan string. Struktur "terbalik" ini membingungkan pemula. Fungsi helper untuk menormalkan: ubah menjadi array of file agar loop-nya sama seperti single upload.
Catatan teknis: PHP punya batas upload di
php.ini:upload_max_filesizedanpost_max_size(default XAMPP biasanya 2M-8M). File lebih besar dari batas ditolak diam-diam dengan error code 1 atau 2. Kalau upload file besar gagal misterius, cek dua pengaturan ini dulu.
Tantangan
Galeri upload
Buat galeri.php: form upload + tampilkan semua gambar di folder uploads/ dengan <img>. Buat folder uploads/ dulu dan pastikan writable. Tampilkan pesan jika belum ada gambar.