Bagaimana cara menangani file unggahan dengan nama duplikat menggunakan PHP? Mengunggah file di PHP menggunakan fungsi `move_uploaded_file()` tanpa penanganan nama file yang tepat dapat menyebabkan file lama tertimpa oleh file baru. Sebagian pengembang menangani nama file unggahan dengan mengubahnya menjadi nama unik menggunakan logika mereka sendiri. Jika Anda ingin mengunggah file namun tetap mempertahankan nama aslinya, Anda dapat melakukannya dengan memanfaatkan perulangan `while` dan iterasi, tanpa perlu menyimpan nama file tersebut ke dalam database.
Penggunaan perulangan `while` dan iterasi tidak akan mempertahankan nama file asli secara persis sama, karena kita perlu menambahkan angka iterasi pada nama file tersebut untuk mencegah tertimpanya file lama.
Berikut adalah contoh cara menangani file unggahan dengan nama duplikat menggunakan PHP.
<?php
$dir = "uploads/";
// Get file's path info
$filepath_info = pathinfo($_FILES['upload']['name']);
//filename
$filename = $filepath_info['filename'];
// File Extension
$extension = $filepath_info['extension'];
// Iteration starting Value
$i = 0;
while(true){
// Filename additional text
$additional_txt = ($i>0) ? " ({$i})" : "";
// Temporary new filename
$tempname = $filename.$additional_txt.".".$extension;
// Cheching Filename Duplicate
if(is_file($dir.$tempname)){
// If has duplicate
$i++;
}else{
// Renew Filename
$filename = $tempname;
// break the loop
break;
}
}
// Upload file
$upload = move_uploaded_file($_FILES['upload']['tmp_name'], $dir.$filename);
Berdasarkan cuplikan kode di atas, file yang diunggah dengan nama yang sama di direktori unggahan akan disimpan dengan format: [nama_asli] ([nomor_iterasi]).[ekstensi_file].
Contoh Berikut adalah contoh cuplikan kode aplikasi web yang mendemonstrasikan tujuan tutorial ini.
Antarmuka Halaman Cuplikan di bawah ini berisi gabungan skrip PHP dan HTML yang menampilkan halaman sederhana dengan formulir unggah dan daftar file yang telah diunggah. Simpan cuplikan tersebut sebagai index.php.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Handling Upload w/ Duplicate Filename | PHP</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css" integrity="sha512-xh6O/CkQoPOWDdYTDqeRdPCVd1SpvCA9XXcUnZS2FmJNp1coAFzvtCN9BmamE+4aHK8yyUHUSCcJHgXloTyT2A==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/js/all.min.js" integrity="sha512-naukR7I+Nk6gp7p5TMA4ycgfxaZBJ7MO5iC3Fp6ySQyKFHOGfpkSZkYVWV5R7u7cfAicxanwYQ5D1e17EfJcMA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://code.jquery.com/jquery-3.6.1.min.js" integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3" crossorigin="anonymous"></script>
<style>
html, body{
min-height:100%;
width:100%;
}
.table-holder{
width:100%;
max-height:65vh;
overflow:auto;
}
.table>thead{
position:sticky;
top:0;
background:white;
z-index: 1;
}
</style>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-primary bg-gradient">
<div class="container">
<a class="navbar-brand" href="./">Handling Upload w/ Duplicate Filename</a>
<div>
<a href="" class="text-light fw-bolder h6 text-decoration-none" target="_blank">SourceCodester</a>
</div>
</div>
</nav>
<div class="container-fluid px-5 my-3" id="SampleApp">
<div class="col-lg-6 col-md-10 col-sm-12 mx-auto">
<h3 class="text-center"><b>Handling Upload w/ Duplicate Filename in PHP</b></h3>
<div class="d-flex w-100 justify-content-center">
<hr class="w-50">
</div>
</div>
<div class="col-lg-6 col-md-8 col-sm-12 mx-auto mb-3">
<div class="card rounded-0 shadow" id="dataSheetCard">
<div class="card-header rounded-0">
<div class="d-flex w-100 justify-content-between">
<div class="col-auto flex-shrink-1 flex-grow-1">
<div class="card-title">Upload Form</div>
</div>
</div>
</div>
<div class="card-body rounded-0">
<div class="container-fluid">
<form action="upload.php" method="POST" enctype="multipart/form-data" id="upload-form">
<div class="mb-3">
<label for="upload" class="form-label">Choose File</label>
<input class="form-control form-control-sm" id="upload" name="upload" type="file">
</div>
<div class="mb-3">
<div class="d-grid">
<button class="btn btn-primary rounded-pill">Upload</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="col-lg-6 col-md-8 col-sm-12 mx-auto mb-3">
<div class="card rounded-0 shadow" id="dataSheetCard">
<div class="card-header rounded-0">
<div class="d-flex w-100 justify-content-between">
<div class="col-auto flex-shrink-1 flex-grow-1">
<div class="card-title">Uploaded Files</div>
</div>
</div>
</div>
<div class="card-body rounded-0">
<div class="container-fluid">
<?php
$files = [];
if(is_dir("uploads/")){
$files = scandir("uploads");
}
unset($files[0]);
unset($files[1]);
asort($files);
?>
<div class="list-group">
<?php foreach($files as $file): ?>
<a href="uploads/<?= $file ?>" class="list-group-item list-group-item-action" target="_blank"><?= $file ?></a>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="app.js"></script>
</body>
</html>
API Unggah
Berikut adalah potongan kode yang menangani pengunggahan berkas. Skrip ini memuat kode PHP—serupa dengan yang saya berikan sebelumnya—untuk menangani berkas dengan nama yang sama di direktori unggahan.
<?php
if($_SERVER['REQUEST_METHOD'] == "POST"){
if(isset($_FILES['upload']) && !empty($_FILES['upload'])){
//Upload files directory
$dir = "uploads/";
//Create Upload Directory If not existing yet
if(!is_dir($dir))
mkdir($dir);
// Get file's path info
$filepath_info = pathinfo($_FILES['upload']['name']);
//filename
$filename = $filepath_info['filename'];
// File Extension
$extension = $filepath_info['extension'];
// Iteration starting Value
$i = 0;
while(true){
// Filename additional text
$additional_txt = ($i>0) ? " ({$i})" : "";
// Temporary new filename
$tempname = $filename.$additional_txt.".".$extension;
// Cheching Filename Duplicate
if(is_file($dir.$tempname)){
// If has duplicate
$i++;
}else{
// Renew Filename
$filename = $tempname;
// break the loop
break;
}
}
// Upload file
$upload = move_uploaded_file($_FILES['upload']['tmp_name'], $dir.$filename);
if($upload){
// If uploading file is successful
echo "<script> alert(`File has been uploaded successfully.`); location.replace('./') </script>";
}
else{
// If Uploading File fails
echo "<script> alert(`File uploading failed due to some reason.`); location.replace(document.referer) </script>";
}
}
}else{
echo "<script> alert(`The request was not executed using POST Method.`); location.replace(location.referer)</script>";
}
?>