Upload file PHP

Web form HTML bisa digunakan untuk menerima input file yang diberikan oleh user melalui proses upload. Namun sebuah web form HTML sederhana dapat disalahgunakan oleh spammer dan hacker.

Oleh karena itu sebuah web form HTML yang digunakan untuk keperluan upload file harus dilengkapi dengan system keamanan. Salah satu caranya adalah dengan code PHP.

Berikut ini adalah cara kerja web form HTML yang sudah dilengkapi dengan code PHP untuk memproses file yang diupload:

  1. User membuka sebuah webpage yang berisi web form HTML. Kemudian user akan mengupload sebuah file menggunakan web form HTML ini.
  2. User klik tombol browse, selanjutnya memilih file untuk diupload dari komputer yang user gunakan. Lalu nama file akan muncul.
  3. User klik tombol submit, selanjutnya file dikirimkan ke dalam sebuah folder sementara di server.
  4. Script PHP akan memindahkan file tersebut ke dalam sebuah folder khusus lain untuk disimpan.
  5. Script PHP akan memberikan konfirmasi bahwa file sudah berhasil diupload atau tidak.

Membuat web form HTML

Web form yang akan kita buat dirancang hanya bisa digunakan untuk mengupload file berjenis gambar. Berikut ini adalah code web form HTML yang akan kita gunakan:

<form action="proses.php" method="post" enctype="multipart/form-data">
Pilih file gambar untuk diupload:
<input type="file" name="fileUpload" id="fileUpload">
<input type="submit" value="UploadGambar" name="submit">
</form>

Pada code di atas:

  • Atribut action menentukan tempat penyimpanan file yang diupload.
  • Atribut method menentukan cara mengirim data dari web form HTML menuju file penyimpanan data.
  • Atribut enctype menentukan proses encoded data yang diberikan oleh user melalui web form. Atribut enctype="multipart/form-data" digunakan bila data yang diberikan oleh user berupa file.
  • Atribut type="file" memunculkan tombol browse yang digunakan untuk mengupload file.

Berikut ini adalah hasil tampilan dari code web form di atas:

Pilih file gambar untuk diupload:


Superglobal $_FILES

Saat sebuah file diupload maka secara otomatis terbentuk $_FILES yang berisi informasi mengenai file tersebut. $_FILES adalah sebuah superglobal yang memiliki bentuk associative array.

Untuk setiap file yang diupload ada lima buah informasi, yaitu:

  • $_FILES['fileUpload']['name'] – Nama file yang diupload.
  • $_FILES['fileUpload']['type'] – Jenis MIME dari file yang diupload (contoh: image/gif).
  • $_FILES['fileUpload']['size'] – Ukuran file yang diupload dalam byte.
  • $_FILES['fileUpload']['tmp_name'] – Alamat sementara file yang diupload (file path).
  • $_FILES['fileUpload']['error'] – Status error dari file yang diupload.

Code ['fileUpload'] di atas berasal dari atribut [name] pada web form HTML.

Berikut ini adalah status error yang bisa dihasilkan oleh $_FILES:

Pesan Status Arti
UPLOAD_ERR_OK 0 File berhasil diupload
UPLOAD_ERR_INI_SIZE 1 Ukuran file lebih besar dari yang diijinkan oleh upload_max_filesize di dalam file php.ini
UPLOAD_ERR_FORM_SIZE 2 Ukuran file lebih besar dari yang diijinkan oleh MAX_FILE_SIZE di dalam web form HTML
UPLOAD_ERR_NO_FILE 4 Tidak ada file yang diupload
UPLOAD_ERR_NO_TMP_DIR 6 PHP tidak memiliki ijin untuk mengakses tempat penyimpanan sementara file
UPLOAD_ERR_CANT_WRITE 7 File tidak bisa dimasukkan ke dalam hardisk server
UPLOAD_ERR_EXTENSION 8 Proses upload terhenti karena sebuah file sedang dijalankan

Memproses file yang diupload

Setelah user mengupload file menggunakan web form HTML maka selanjutnya file tersebut akan dikirim menuju tempat penyimpanan sementara di server. Kemudian data mengenai file yang diupload akan dikirim menuju file [proses.php]. File [proses.php] kemudian memproses file yang diupload oleh user.

Berikut ini adalah isi file [proses.php]:

<?php
// Menentukan folder tempat file akan disimpan
$target_folder = "uploads/";

// Menentukan alamat file yang baru (file path), uploads/namafile.ekstensi
$target_file = $target_folder . basename($_FILES["fileUpload"]["name"]);

// Status error file yang diupload
$status_upload = 1;

// ekstensi file yang diupload
$jenis_file = pathinfo($target_file,PATHINFO_EXTENSION);

// Memeriksa jika file yang dikirim berupa file gambar atau bukan.
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File gambar - " . $check["mime"] . ".";
        $status_upload = 1;
    } else {
        echo "Bukan file gambar.";
        $status_upload = 0;
    }
}
// Memeriksa jika file sudah ada
if (file_exists($target_file)) {
    echo "Maaf, file dengan nama tersebut sudah ada.";
    $status_upload = 0;
}
// Memeriksa ukuran file
if ($_FILES["fileUpload"]["size"] > 100000) {
    echo "Maaf, ukuran file terlalu besar.";
    $status_upload = 0;
}
// Mengijinkan beberapa jenis image file
if($jenis_file != "jpg" && $jenis_file != "png" && $jenis_file != "jpeg" && $jenis_file != "gif" ) {
    echo "Maaf, Hanya file jenis JPG, JPEG, PNG & GIF yang diijinkan.";
    $status_upload = 0;
}
// Memeriksa status error file
if ($status_upload == 0) {
    echo " Maaf, file tidak terupload.";
    // Jika tidak ada error: jalankan upload file
} else {
    if (move_uploaded_file($_FILES["fileUpload"]["tmp_name"], $target_file)) {
        echo "File ". basename( $_FILES["fileUpload"]["name"]). " sudah terupload.";
    } else {
        echo "Maaf, terjadi error pada proses upload file.";
    }
}
?>

Berikut ini adalah penjelasan code di atas:

$target_folder = "uploads/";

[uploads] merupakan alamat folder tempat kita akan memindahkan file yang diupload (folder path). Folder path ini kemudian kita simpan di dalam variable bernama [$target_folder].

Sebelum menggunakan code ini kamu sudah harus memiliki folder bernama [uploads] karena folder ini tidak secara otomatis terbentuk. Folder [uploads] harus berada di tempat yang sama dengan file [uploader.php].

basename($_FILES["fileUpload"]["name"])

Code basename() function berguna untuk menghasilkan nama file yang diambil dari sebuah alamat file (file path). Code basename() function di atas menghasilkan nama file yang diupload.

$target_file = $target_folder . basename($_FILES["fileUpload"]["name"]);

Code di atas menghasilkan alamat file yang diupload setelah dipindahkan ke tempat baru (file path). File path ini kemudian disimpan di dalam variable [$target_file].

$status_upload = 1;

Code di atas adalah memberi nilai awal pada variable [$status_upload] dengan angka 1. Variable ini akan digunakan pada code berikutnya sebagai status error file yang diupload apakah ada masalah pada file tersebut atau pada proses upload dan sebagainya.

$jenis_file = pathinfo($target_file,PATHINFO_EXTENSION);

Code pathinfo() function berguna untuk membagi sebuah alamat file (path file) menjadi beberapa bagian yang akan disimpan di dalam sebuah array. Code pathinfo() function di atas menghasilkan ekstensi file yang diupload.

if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileUpload"]["tmp_name"]);
    if($check !== false) {
        echo "File gambar - " . $check["mime"] . ".";
        $status_upload = 1;
    } else {
        echo "Bukan file gambar.";
        $status_upload = 0;
    }
}

Code $_POST["submit"] adalah associative array yang dihasilkan oleh tombol submit pada web form HTML.

Code isset() function digunakan untuk memeriksa apakah array $_POST["submit"] berisi data atau tidak. Code isset() function akan menghasilkan nilai boolean [true] jika sebuah variable tidak berisi nilai NULL.

Code getimagesize() function digunakan untuk memeriksa apakah file yang dikirim merupakan file gambar atau bukan.

Jika file gambar bisa diproses oleh getimagesize() function maka getimagesize() function akan menyimpan ukuran atau informasi mengenai gambar tersebut. Sebaliknya jika file gambar tidak bisa diproses oleh getimagesize() function karena tidak sesuai formatnya atau karena alasan lain maka getimagesize() function akan menghasilkan nilai boolean [FALSE] dan menampilkan pesan error E_WARNING.

Code $check["mime"] adalah hasil dari getimagesize() function yang menyimpan jenis gambar (contoh: image/jpeg).

Code [!==] adalah comparison operator yang artinya tidak sama dengan.

Code if statement di atas berguna untuk memeriksa apakah file sudah diupload atau belum. Jika $_POST["submit"] memiliki nilai boolean [true] maka artinya file sudah diupload. Sebaliknya jika $_POST["submit"] memiliki nilai boolean [false] maka artinya file belum diupload.

Selanjutnya setelah if statement memberikan konfirmasi bahwa file telah diupload:

  • Variable [$check] menyimpan informasi ukuran gambar yang didapatkan menggunakan code getimagesize() function.
  • Code if else statement dijalankan.

Pada code if else statement di atas:

  • Jika variable [$check] benar berisi ukuran gambar maka akan ada pesan bahwa file yang diupload merupakan file gambar dan variable [$status_upload] akan memiliki nilai 1.
  • Jika variable [$check] memiliki nilai [false] maka akan ada pesan bahwa file yang diupload bukan file gambar dan variable [$status_upload] akan memiliki nilai 0.
if (file_exists($target_file)) {
    echo "Maaf, file dengan nama tersebut sudah ada.";
    $status_upload = 0;
}

Code file_exists() function berguna untuk mencari sebuah file di dalam folder.

Jika file yang dicari ditemukan maka file_exists() function akan menghasilkan [TRUE] dan sebaliknya jika file yang dicari tidak ditemukan maka file_exists() function akan menghasilkan [FALSE].

Code if statement di atas berguna untuk memeriksa jika di dalam folder [uploads] ada file dengan nama sama dengan file yang ingin diupload. Jika benar di dalam folder [uploads] ada file dengan nama sama dengan file yang ingin diupload maka pesan error akan muncul dan variable [$status_upload] akan berisi angka 0.

if ($_FILES["fileUpload"]["size"] > 100000) {
    echo "Maaf, ukuran file terlalu besar.";
    $status_upload = 0;
}

Code di atas berguna untuk memeriksa ukuran file yang diupload. Jika lebih besar dari 100kb maka pesan error akan ditampilkan dan variable [$status_upload] akan berisi angka 0.

if($jenis_file != "jpg" && $jenis_file != "png" && $jenis_file != "jpeg" && $jenis_file != "gif" ) {
    echo "Maaf, Hanya file jenis JPG, JPEG, PNG & GIF yang diijinkan.";
    $status_upload = 0;
}

Code di atas berguna untuk membatasi jenis file yang diupload. Selain file berekstensi JPG, JPEG, PNG, dan GIF maka code di atas akan memunculkan pesan error dan variable [$status_upload] akan berisi angka 0.

if (move_uploaded_file($_FILES["fileUpload"]["tmp_name"], $target_file)) {
    echo "File ". basename( $_FILES["fileUpload"]["name"]). " sudah terupload.";
} else {
    echo "Maaf, terjadi error pada proses upload file.";
}

File yang diupload ke server melalui web form HTML akan ditempatkan secara otomatis pada tempat penyimpanan sementara. Jika file yang diupload melalui web form HTML tidak dipindahkan ke tempat lain maka file tersebut akan dibuang secara otomatis.

Code move_uploaded_file() function berguna untuk memindahkan file yang diupload melalui web form HTML dari lokasi sementara menuju lokasi baru.

Pada code if else statement di atas:

  • Jika code move_uploaded_file() function berhasil dijalankan maka akan ada pesan bahwa file berhasil diupload.
  • Jika code move_uploaded_file() function tidak berhasil dijalankan maka akan ada pesan bahwa file tidak berhasil diupload.
if ($status_upload == 0) {
    echo " Maaf, file tidak terupload.";
} else {
    if () {...} else {...}
}

Pada code if else statement di atas:

  • Jika variable [$status_upload] sama dengan angka 0 artinya ada masalah pada file yang ingin diupload sehingga akan muncul pesan bahwa file tidak diupload.
  • Jika variable [$status_upload] tidak sama dengan angka 0 artinya file tidak bermasalah dan bisa diupload. Kemudian code if else statement akan dijalankan.

One Response to “Upload file PHP”

  1. adventure says:

    You’ve captured this perfectly. Thanks for taking the time!

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>