Beranda › Blog › Tips & Tutorial › Tutorial Menangani Unggahan Nama File Duplikat di…
Tutorial Menangani Unggahan Nama File Duplikat di PHP

Tutorial Menangani Unggahan Nama File Duplikat di PHP

Dalam tutorial ini, Anda akan mempelajari cara menangani file yang diunggah yang memiliki nama sama (duplikat) dengan file yang sudah ada di direktori unggahan. Tutorial ini bertujuan memberikan referensi bagi mahasiswa IT dan programmer pemula mengenai penanganan file unggahan PHP yang memiliki nama duplikat. Saya akan menyajikan potongan kode untuk mencapai tujuan tutorial ini. Tersedia pula file ZIP berisi contoh kode sumber yang saya buat khusus untuk tutorial ini dan dapat diunduh secara gratis.

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>";
}
 
?>
Bagikan: WhatsApp X / Twitter
Kembali ke Daftar Artikel
W
Butuh Solusi Digital?

Konsultasikan kebutuhan bisnis Anda bersama kami — gratis.

Konsultasi Gratis →