Переименуйте файл, если он уже существует


Я пытаюсь загрузить файл и переименовать его, если он уже существует. Я хочу сделать так, чтобы при загрузке одного и того же файла имя просто добавляло 1, затем 2, затем 3 и так далее.

Пример: если файл "file" существует, то новый файл должен быть "file1", а затем следующий"file2".

Я видел несколько примеров в сети, но ничего, что я мог бы найти подходящим для моего кода (noob)

Теперь это мой код:

$id = $_SESSION['id'];
$fname = $_FILES['dok']['name'];
if ($_FILES['dok']['name'] !=""){
// Checking filetype
if($_FILES['dok']['type']!="application/pdf")     {die("You can only upload PDF files");}

// Checking filesize
if ($_FILES['dok']['size']>1048576) {die("The file is too big. Max size is 1MB");}

// Check if user have his own catalogue
if (file_exists("filer/".$id."/")) {
// Moving the file to users catalogue
move_uploaded_file($_FILES['dok']['tmp_name'],"filer/".$id."/".$fname);}

//If user don't have his own catalogue 
else {
// Creates new catalogue then move the file in place
mkdir("filer/".$id);
move_uploaded_file($_FILES['dok']['tmp_name'],"filer/".$id."/".$fname);   } }

Может кто-нибудь помочь мне, где я могу ввести код, который решает эту проблему проблема? Большое спасибо!

3 2

3 ответа:

$id = $_SESSION['id'];
$fname = $_FILES['dok']['name'];
if ($_FILES['dok']['name'] !=""){
    // Checking filetype
    if($_FILES['dok']['type']!="application/pdf") {
        die("You can only upload PDF files");
    }
    // Checking filesize
    if ($_FILES['dok']['size']>1048576) {
        die("The file is too big. Max size is 1MB");
    }

    if(!is_dir("filer/".$id."/")) {
        mkdir("filer/".$id); 
    }

    $rawBaseName = pathinfo($fname, PATHINFO_FILENAME );
    $extension = pathinfo($fname, PATHINFO_EXTENSION );
    $counter = 0;
    while(file_exists("filer/".$id."/".$fname)) {
        $fname = $rawBaseName . $counter . '.' . $extension;
        $counter++;
    };

    move_uploaded_file($_FILES['dok']['tmp_name'],"filer/".$id."/".$fname);  

} 

Но не забудьте защитить свой скрипт (например, смотрите комментарий Марка Б выше) , и, возможно, вы могли бы оптимизировать еще немного; -)

Итак, если папка существует:

file_exists("filer/".$id."/")

Проверьте, существует ли файл

file_exists("filer/".$id."/".$fname)

А затем, если это произойдет,

$fname = $fname . "(1)" // or some appending string

Таким образом, в конце вы измените свой код на:

// Check if user have his own catalogue
if (file_exists("filer/".$id."/")) {
    while (file_exists("filer/".$id."/".$fname)) // Now a while loop
        $fname = "copy-" . $fname; // Prepending "copy-" to avoid breaking extensions

    // Moving the file to users catalogue
    move_uploaded_file($_FILES['dok']['tmp_name'],"filer/".$id."/".$fname);}

//If user don't have his own catalogue 
else {
<form action="test.php" method="post" enctype="multipart/form-data">
Select file to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload File" name="submit">
</form>

<?php
$id = $_SESSION['id'];
$fname = $_FILES['fileToUpload']['name'];
 // Checking filesize
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], "uploads/".$id."/".$fname)) {
    echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
}else {
    echo "Sorry, there was an error uploading your file.";
}
// Check file size$
if ($_FILES['fileToUpload']['size']>1048576) {
    die("The file is too big. Max size is 1MB");
}
if(!is_dir("uploads/".$id."/")) {
    mkdir("uploads/".$id); 
}

$rawBaseName = pathinfo($fname, PATHINFO_FILENAME );
$extension = pathinfo($fname, PATHINFO_EXTENSION );
$counter = 0;
while(file_exists("uploads/".$id."/".$fname)) {
    $fname = $rawBaseName . $counter . '.' . $extension;
    $counter++;
};

move_uploaded_file($_FILES['fileToUpload']        ['tmp_name'],"uploads/".$id."/".$fname);  
?>