Cara Membuat Optional File Upload di PHP

Cara Membuat Optional File Upload di PHP

Optional file upload yang dimaksud disini adalah pengguna dapat memilih untuk mengupload sebuah file atau mengabaikannya, misalnya file tersebut adalah file untuk isian foto/gambar atau sebuah dokumen user bisa mengisinya atau tidak. Jadi pengisiannya bisa dibuat tidak wajib.

Saya akan memberikan sebuah contoh yang menurut logika saya sendiri, jadi mungkin kalau ada yang lebih baik dari ini, Anda bisa mencoba untuk menggunakan yang lebih baik daripada cara yang akan saya jelaskan ini.

Contoh penulisan kode ini menggunakan prepared statemenet, kode ini sudah pernah saya buat sebelumnya pada postingan CRUD PHP Procuderal Style Jadi disini saya hanya tinggal menambahkan script untuk isian foto pada bagian input dan function untuk menyimpan datanya.

Silahkan baca : CRUD PHP Procedural Style

DASAR PEMIKIRAN OPTIONAL FILE UPLOAD
Logika sederhananya kita bisa membuat dua buah kondisi, yaitu kondisi pertama jika user mengosongkan inputan pada isian file upload maka data akan tetap bisa dieksekusi dan kondisi kedua jika data pada file upload memiliki isi maka, data akan divalidasi ukuran dan jenisnya apakah sesuai atau tidak. 

KONDISI NORMAL

Pada kondisi normal saya akan membuat penulisan kode dimana data file upload yang di input oleh user tidak boleh kosong, ukurannya tidak boleh lebih dari 2MB dan harus berfomat jpg, jpeg, dan png. Berikut contohnya :
<?php
include ('koneksi.php');
include ('function.php');
?>
<?php
//set variabel
$nim = $nama_mahasiswa = $foto_mahasiswa = "";
$nim_err = $nama_mahasiswa_err = $foto_mahasiswa_err = "";
if($_SERVER["REQUEST_METHOD"] == "POST"){
    if(empty(trim($_POST['nim']))){
        $nim_err = "Nim tidak boleh kosong";
    }else{
        $nim=$_POST['nim'];
        $nim=mysqli_real_escape_string($koneksi, $nim);
    }
    
    if(empty(trim($_POST['nama_mahasiswa']))){
        $nama_mahasiswa_err = "Nama mahasiswa tidak boleh kosong";
    }else{
        $nama_mahasiswa = $_POST['nama_mahasiswa'];
        $nama_mahasiswa = mysqli_real_escape_string($koneksi, $nama_mahasiswa);
    }
    $imgFile = $_FILES['foto_mahasiswa']['name']; //name image
    $tmp_dir= $_FILES['foto_mahasiswa']['tmp_name']; //temporari file
    $imgSize = $_FILES['foto_mahasiswa']['size']; //info size
    $upload_dir = 'foto/'; //path upload
    $imgExt=strtolower(pathinfo($imgFile,PATHINFO_EXTENSION)); //mendapatkan info extension dari $imgFile
    $valid_extension = array('jpeg','jpg','png'); //extensi yang diperbolehkan
    $item_foto = rand(100, 1000000).".".$imgExt; //merename foto secara random
   
    //memulai validasi
    if(!empty($_FILES['foto_mahasiswa']['tmp_name'])){ //jika file tidak kosong, jalankan cabang pertama
        if(in_array($imgExt, $valid_extension)){ //cabang kedua memastikan ektensi
            if(!$imgFile < 2000000){ //cabang ketiga memastikan besar file
                //jika kurang dari 2MB simpan file
                $foto_mahasiswa=$tmp_dir; //nanti di eksekusi di function untuk bagian move upload, sementara disimpan dulu dalam bentuk var
            }else{
                $foto_mahasiswa_err = "Maaf foto mahasiswa tidak boleh lebih dari 2MB";
            }
        }else{
            $foto_mahasiswa_err = "Maaf ektensi foto tidak sesuai, upload hanya jenis jpeg, png, jpg";
        }

    }else{
       $foto_mahasiswa_err ="Foto mahasiswa masih kosong";
        
    }
//cek input sebelum insert untuk memastikan tidak ada data yang error
    if(empty($nim_err) && empty($nama_mahasiswa_err) && empty($foto_mahasiswa_err)){

    /* Panggil function */
        if(simpan_mahasiswa($nim, $nama_mahasiswa, $foto_mahasiswa)){
            echo 'Berhasil menyimpan data';
            echo "<a href='tampil_data.php'>Tampil data</a>";
        }else{
            echo 'Gagal menyimpan data';
        }
      
}
  mysqli_close($koneksi);
  //close koneksi

    //end POST  
    }


?>

<html>
<head>
    <title>Input Mahasiswa root93</title>
</head>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>" enctype="multipart/form-data" />
<label>Nim :</label>
<input type="text" name="nim" size="15" />
<label>Nama Mahasiswa :</label>
<input type="text" name="nama_mahasiswa" size="15" />
<label>Foto</label>
<input type="file" name="foto_mahasiswa" id="foto_mahasiswa" />
<input type="Submit" name="submit" value="Submit">
</form>
<?php echo $nim_err; ?>
<?php echo $nama_mahasiswa_err; ?>
<?php echo $foto_mahasiswa_err; ?>
</body>
</html>


Selanjutnya pada bagian function yang bertugas menyimpan datanya, saya perlu menambahkan beberapa baris dan perintah untuk mengeksekusi file yang ada supaya diupload ke direktori tujuan. Anda dapat menulisnya seperti berikut :
<?php
//function simpan data
function simpan_mahasiswa($nim, $nama_mahasiswa, $foto_mahasiswa){
    global $koneksi;
    global $upload_dir;
    global $item_foto;
    $sql="INSERT INTO datamhs(nim, nama_mahasiswa, foto_mahasiswa) VALUES (?,?,?)";
    if($stmt=mysqli_prepare($koneksi, $sql)){
        mysqli_stmt_bind_param($stmt,"sss",$param_nim, $param_nama_mahasiswa, $param_foto_mahasiswa);
        $param_nim = $nim;
        $param_nama_mahasiswa = $nama_mahasiswa;
        $param_foto_mahasiswa = $item_foto;
      
 if(mysqli_stmt_execute($stmt)&&(move_uploaded_file($foto_mahasiswa, $upload_dir.$item_foto))){
    return true;
 }else{
    return false;
 }

 }
 //Close statement
 mysqli_stmt_close($koneksi);
 //End function
 }
?>

KONDISI OPTIONAL

Pada kondisi optional saya akan membiarkan user agar tidak perlu melakukan pengisian pada bagian file upload. Namun ketika user mengisi file upload dia akan divalidasi, ukurannya tidak boleh lebih dari 2MB dan harus berfomat jpg, jpeg, dan png. Berikut contohnya :

<?php
include ('koneksi.php');
include ('function.php');
?>
<?php
//set variabel
$nim = $nama_mahasiswa = $foto_mahasiswa = "";
$nim_err = $nama_mahasiswa_err = $foto_mahasiswa_err = "";
if($_SERVER["REQUEST_METHOD"] == "POST"){
    if(empty(trim($_POST['nim']))){
        $nim_err = "Nim tidak boleh kosong";
    }else{
        $nim=$_POST['nim'];
        $nim=mysqli_real_escape_string($koneksi, $nim);
    }
    
    if(empty(trim($_POST['nama_mahasiswa']))){
        $nama_mahasiswa_err = "Nama mahasiswa tidak boleh kosong";
    }else{
        $nama_mahasiswa = $_POST['nama_mahasiswa'];
        $nama_mahasiswa = mysqli_real_escape_string($koneksi, $nama_mahasiswa);
    }
    if (empty($_FILES["foto_mahasiswa"]["tmp_name"])){
            //ketika kondisi data kosong
            $imgFile = "";
            $tmp_dir = "";      
            $upload_dir = 'foto/';
            $imgExt="jpg";
            $item_foto = rand(1000,1000000).".".$imgExt;             
            $foto_mahasiswa=$tmp_dir; 
        
        }else{
            //ketika user mengsisi file upload
            $imgFile = $_FILES['foto_mahasiswa']['name'];
            $tmp_dir = $_FILES['foto_mahasiswa']['tmp_name'];
            $imgSize = $_FILES['foto_mahasiswa']['size'];
            $upload_dir = 'foto/';
            $imgExt = strtolower(pathinfo($imgFile,PATHINFO_EXTENSION)); 
            $valid_extensions = array('jpeg', 'jpg', 'png', 'gif'); 
            $item_foto = rand(1000,1000000).".".$imgExt;
            if(in_array($imgExt, $valid_extensions)){           
            if($imgSize > 400000){
            $foto_mahasiswa_err="Foto terlalu besar.Max 400KB";
       
            }else{
             $foto_mahasiswa=$tmp_dir;    
            } 
            }else{
            $foto_mahasiswa_err="Ektensi Foto siswa tidak sesuai ketentuan upload, format JPEG, PNG";
                
            }     
}
//cek input sebelum insert untuk memastikan tidak ada data yang error
    if(empty($nim_err) && empty($nama_mahasiswa_err) && empty($foto_mahasiswa_err)){

    /* Panggil function */
        if(simpan_mahasiswa($nim, $nama_mahasiswa, $foto_mahasiswa)){
            echo 'Berhasil menyimpan data';
            echo "<a href='tampil_data.php'>Tampil data</a>";
        }else{
            echo 'Gagal menyimpan data';
        }
      
}
  mysqli_close($koneksi);
  //close koneksi

    //end POST  
    }


?>

<html>
<head>
    <title>Input Mahasiswa root93</title>
</head>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>" enctype="multipart/form-data" />
<label>Nim :</label>
<input type="text" name="nim" size="15" />
<label>Nama Mahasiswa :</label>
<input type="text" name="nama_mahasiswa" size="15" />
<label>Foto</label>
<input type="file" name="foto_mahasiswa" id="foto_mahasiswa" />
<input type="Submit" name="submit" value="Submit">
</form>
<?php echo $nim_err; ?>
<?php echo $nama_mahasiswa_err; ?>
<?php echo $foto_mahasiswa_err; ?>
</body>
</html>


Pada bagian function kita tidak perlu melakukan tambahan atau perubah. Namun pada kondisi ini kalian bisa melihat bahwa nanti php akan mengembalikan nilai false.

Meskipun mengembalikan nilai false, data sebenarnya tetap disimpan, menurut saya pesan kesalahan tersebut dikarenakan variabel yang digunakan dalam fungsi move_upload_file(); dalam keadaan kosong.
MERUBAH FUNCTION

Karena kondisi optional masih bermasalah dan mengembalikan nilai false meskipun datanya tetap disimpan. Kondisi false diakibatkan  nilai variabel pada ungsi move_upload_file(); dalam keadaan kosong. Oleh karena itu pada function kita perlu membuat dua kondisi lagi dimana sebelumnya kita cek apakah nilai variabel pada foto_mahasiswa kosong atau tidak.


<?php
function simpan_mahasiswa($nim, $nama_mahasiswa, $foto_mahasiswa){
    global $koneksi;
    global $upload_dir;
    global $item_foto;
    $sql="INSERT INTO datamhs(nim, nama_mahasiswa, foto_mahasiswa) VALUES (?,?,?)";
    if($stmt=mysqli_prepare($koneksi, $sql)){
        mysqli_stmt_bind_param($stmt,"sss",$param_nim, $param_nama_mahasiswa, $param_foto_mahasiswa);
        $param_nim = $nim;
        $param_nama_mahasiswa = $nama_mahasiswa;
        $param_foto_mahasiswa = $item_foto;
    //cek apakah nilai var kosong atau tidak, jika kosong eksekusi tanpa move
    if(empty($foto_mahasiswa)){
     if(mysqli_stmt_execute($stmt)){
      return true;
   }else{
      return false;
   }
    }else{  
  if(mysqli_stmt_execute($stmt)&&(move_uploaded_file($foto_mahasiswa, $upload_dir.$item_foto))){
     return true;
  }else{
     return false;
  }
 }
 
 }
 //Close statement
 mysqli_stmt_close($koneksi);
 //End function
 }
 ?>

Sampai disini mungkin kita sudah berhasil membuat optional file upload di php, user dapat memilih untuk mengosongkan isian pada bagian inputan file atau mengisinya. Untuk sisanya, kalian bisa berimajinasi  sendiri, dan disesuaikan dengan kebutuhan masing - masing

Demo Optional File Upload


1 Response to "Cara Membuat Optional File Upload di PHP "

  1. Wahhh mantep banget nih.. Semua artikel di blog ini kalau dijadiin saatu bisa jadi sebuah website local host yang menabjubkan.. :D

    ReplyDelete

Komentar yang Anda kirim akan terlebih dahulu di moderasi oleh Admin