0Pricing
PHP Academy · Pelajaran

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 bytes

Kode 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 unggahan
  • upload_max_filesize = 8M — ukuran maksimum satu berkas
  • post_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

  1. Membaca File dengan PHP
  2. Menulis dan Menambahkan Isi ke File
  3. Mengelola Direktori
  4. Menangani Unggahan File
← Kembali ke PHP Academy