Tutorial PHP #19: Upload File di PHP

1. Dasar Upload File

PHP mendukung upload file melalui form HTML. Untuk mengaktifkan upload, form harus menggunakan:

  • Method POST
  • Attribute enctype="multipart/form-data"
<form method="POST" action="upload.php" enctype="multipart/form-data">
    <label>Pilih Gambar:</label>
    <input type="file" name="gambar" accept="image/*">
    <button type="submit">Upload</button>
</form>

2. Superglobal $_FILES

PHP menyimpan info file yang diupload di $_FILES.

<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    // Lihat semua info file yang diupload
    print_r($_FILES["gambar"]);
}
// Output:
// Array (
//     [name]     => foto.jpg         - nama asli file
//     [type]     => image/jpeg       - MIME type
//     [tmp_name] => C:xampp	mpphpXXXX.tmp  - lokasi temp
//     [error]    => 0                - 0 = tidak ada error
//     [size]     => 245760           - ukuran dalam bytes
// )
?>

3. Upload dengan Validasi Lengkap

<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $file  = $_FILES["gambar"];
    $error = [];

    // 1. Cek apakah ada error saat upload
    if ($file["error"] !== UPLOAD_ERR_OK) {
        $error[] = "Terjadi error saat upload";
    } else {
        // 2. Validasi ukuran file (max 2MB)
        $maxSize = 2 * 1024 * 1024;   // 2 MB dalam bytes
        if ($file["size"] > $maxSize) {
            $error[] = "Ukuran file maksimal 2MB";
        }

        // 3. Validasi tipe file (gunakan finfo untuk keamanan)
        $finfo     = finfo_open(FILEINFO_MIME_TYPE);
        $mimeType  = finfo_file($finfo, $file["tmp_name"]);
        finfo_close($finfo);

        $allowedTypes = ["image/jpeg", "image/png", "image/gif", "image/webp"];
        if (!in_array($mimeType, $allowedTypes)) {
            $error[] = "Tipe file tidak diizinkan. Hanya JPG, PNG, GIF, WEBP";
        }

        // 4. Validasi ekstensi
        $allowedExt = ["jpg", "jpeg", "png", "gif", "webp"];
        $ext = strtolower(pathinfo($file["name"], PATHINFO_EXTENSION));
        if (!in_array($ext, $allowedExt)) {
            $error[] = "Ekstensi file tidak diizinkan";
        }
    }

    if (empty($error)) {
        // 5. Generate nama file unik
        $namaFile  = uniqid("img_") . "." . $ext;
        $uploadDir = "uploads/";

        // 6. Buat folder jika belum ada
        if (!is_dir($uploadDir)) {
            mkdir($uploadDir, 0755, true);
        }

        // 7. Pindahkan file dari temp ke folder tujuan
        if (move_uploaded_file($file["tmp_name"], $uploadDir . $namaFile)) {
            echo "Upload berhasil! File: " . $namaFile;
        } else {
            echo "Gagal memindahkan file";
        }
    } else {
        foreach ($error as $e) {
            echo "- $e <br>";
        }
    }
}
?>

4. Upload Multiple File

<form method="POST" action="upload.php" enctype="multipart/form-data">
    <input type="file" name="foto[]" multiple>
    <button type="submit">Upload Semua</button>
</form>
<?php
if (!empty($_FILES["foto"]["name"][0])) {
    $totalFile = count($_FILES["foto"]["name"]);

    for ($i = 0; $i < $totalFile; $i++) {
        $namaFile = uniqid() . "_" . basename($_FILES["foto"]["name"][$i]);
        move_uploaded_file(
            $_FILES["foto"]["tmp_name"][$i],
            "uploads/" . $namaFile
        );
        echo "Berhasil upload: $namaFile <br>";
    }
}
?>

5. Kode Error Upload

  • UPLOAD_ERR_OK (0) - tidak ada error
  • UPLOAD_ERR_INI_SIZE (1) - file melebihi batas di php.ini
  • UPLOAD_ERR_FORM_SIZE (2) - file melebihi MAX_FILE_SIZE di form
  • UPLOAD_ERR_PARTIAL (3) - file hanya terupload sebagian
  • UPLOAD_ERR_NO_FILE (4) - tidak ada file yang diupload

6. Ringkasan

  • Form upload wajib pakai enctype="multipart/form-data"
  • Data file diakses via $_FILES
  • Selalu validasi ukuran, tipe MIME, dan ekstensi file
  • Gunakan uniqid() untuk nama file yang unik dan hindari konflik
  • Gunakan move_uploaded_file() - lebih aman dari rename() atau copy()

Tutorial berikutnya membahas OOP dasar: class dan object di PHP.


ariq fadhil

Im Ariq Tech, a Top Rated Fullstack Developer with 5+ years of experience, delivering high-quality solutions across 50+ projects.