fileuploadwebMenengah3 mnt baca

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
<?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
<?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
<?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_filesize dan post_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.