Upload File dengan PHP

Mengizinkan user untuk mengupload file (seperti foto profil, dokumen PDF, atau gambar produk) adalah fitur yang sangat sering dipakai.

1. Persiapan Form HTML

Untuk mengupload file, ada dua aturan wajib di form HTML:

  1. method="POST" — File tidak bisa dikirim via GET.
  2. enctype="multipart/form-data" — Atribut ini memberi tahu browser bahwa form mengandung file, bukan hanya teks biasa.
<!-- Form Upload -->
<form action="proses-upload.php" method="POST" enctype="multipart/form-data">
    
    <label for="foto">Pilih Foto Profil:</label>
    <!-- type="file" membuat tombol pilih file -->
    <input type="file" name="foto" id="foto" required>
    
    <button type="submit">Upload</button>
</form>

2. Memahami $_FILES

Ketika form di-submit, data teks biasa masuk ke $_POST, sedangkan data file masuk ke superglobal array $_FILES.

Jika atribut name di input adalah name="foto", maka PHP akan membuat array $_FILES['foto'] yang berisi:

KeyContoh IsiKeterangan
namekucing.jpgNama asli file dari komputer user
typeimage/jpegMIME type dari file
tmp_name/tmp/php7A1.tmpLokasi file sementara di server
error0Kode error (0 berarti sukses)
size102400Ukuran file dalam bytes (102400 bytes = 100 KB)

Cara kerja upload PHP: File yang diupload pertama kali akan disimpan di folder sementara (temporary folder) di server. Tugas kita adalah memindahkan file tersebut dari folder sementara ke folder project kita menggunakan fungsi move_uploaded_file().

3. Script Upload Sederhana

Buat file proses-upload.php:

<?php
// Pastikan form dikirim
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['foto'])) {
    
    // Informasi file
    $namaFile = $_FILES['foto']['name'];
    $tmpName  = $_FILES['foto']['tmp_name'];
    
    // Tentukan folder tujuan (pastikan folder 'uploads' sudah dibuat!)
    $folderTujuan = "uploads/" . $namaFile;
    
    // Pindahkan file dari folder temporary ke tujuan
    if (move_uploaded_file($tmpName, $folderTujuan)) {
        echo "File berhasil diupload! <br>";
        echo "<img src='$folderTujuan' width='200'>";
    } else {
        echo "Gagal mengupload file.";
    }
}
?>
Jangan Lupa Buat Folder!

Fungsi move_uploaded_file() akan gagal jika folder tujuannya belum ada. Pastikan kamu sudah membuat folder bernama uploads di dalam folder project kamu.

4. Keamanan Upload (Sangat Penting!)

Script di atas sangat berbahaya jika digunakan di internet! Orang bisa mengupload file PHP jahat (misal hack.php) dan mengambil alih servermu.

Kita harus melakukan validasi:

  1. Validasi jenis file (hanya izinkan gambar).
  2. Validasi ukuran file (jangan terlalu besar).
  3. Ubah nama file agar unik dan aman dari karakter aneh.

Script Upload Aman

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_FILES['foto'])) {
    
    $file     = $_FILES['foto'];
    $namaFile = $file['name'];
    $tmpName  = $file['tmp_name'];
    $ukuran   = $file['size'];
    $error    = $file['error'];

    // 1. Cek apakah ada error saat upload (misal koneksi putus)
    if ($error !== 0) {
        die("Terjadi kesalahan saat mengupload file.");
    }

    // 2. Validasi Ekstensi (Hanya izinkan jpg, jpeg, png)
    $ekstensiDiizinkan = ['jpg', 'jpeg', 'png'];
    
    // Ambil ekstensi dari file (contoh: kucing.lucu.jpg -> ambil 'jpg')
    $pecahNama = explode('.', $namaFile);
    $ekstensi = strtolower(end($pecahNama));
    
    if (!in_array($ekstensi, $ekstensiDiizinkan)) {
        die("Error: Hanya file JPG, JPEG, dan PNG yang diizinkan!");
    }

    // 3. Validasi Ukuran (Maksimal 2 MB = 2 * 1024 * 1024 bytes)
    $maksimalUkuran = 2 * 1024 * 1024;
    if ($ukuran > $maksimalUkuran) {
        die("Error: Ukuran file terlalu besar! Maksimal 2 MB.");
    }

    // 4. Generate Nama Baru yang Unik
    // Tujuannya agar jika ada 2 orang upload 'kucing.jpg', file tidak tertimpa
    $namaBaru = uniqid() . '-' . time() . '.' . $ekstensi;
    
    // 5. Pindahkan File
    $folderTujuan = "uploads/" . $namaBaru;
    
    if (move_uploaded_file($tmpName, $folderTujuan)) {
        echo "✅ Upload Berhasil!<br>";
        echo "<img src='$folderTujuan' width='200'><br>";
        echo "Nama file yang tersimpan: " . $namaBaru;
        
        // Di titik ini, kamu biasanya menyimpan $namaBaru ke database MySQL
        // $stmt = $pdo->prepare("INSERT INTO users (foto) VALUES (?)");
        // $stmt->execute([$namaBaru]);
        
    } else {
        echo "❌ Gagal memindahkan file.";
    }
}
?>

Menyimpan File vs Database

Pemula sering bertanya: "Apakah file gambar disimpan di dalam database MySQL?"

Jawaban: TIDAK. Menyimpan file biner secara langsung ke dalam kolom database (tipe BLOB) akan membuat database menjadi sangat besar dan lambat.

Praktik terbaik (Best Practice):

  1. Simpan file aslinya di dalam folder server (misal: folder uploads/).
  2. Simpan nama filenya saja (teks string, misal: 64a7b_kucing.jpg) ke dalam database MySQL.
  3. Saat ingin menampilkan, ambil nama file dari database dan pasang di tag HTML: <img src="uploads/<?= $row['foto'] ?>">.

Selanjutnya

Kita sudah mempelajari query lanjutan, pagination, dan pengelolaan file. Semua ini akan menjadi fondasi yang kuat saat membangun fitur seperti sistem login dan autentikasi.

Mari pelajari cara mengamankan halaman web dengan: Session & Autentikasi →.