2014-05-30 2 views
1

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

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

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

Это мой код прямо сейчас:

$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); } } 

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

+0

пробовали ли вы что-нибудь себя? – jeroen

+0

Ваш код очень опасен. Вы непосредственно используете ** ПОЛЬЗОВАТЕЛЬ **, предоставленный '['name']' paramter в качестве конечного местоположения файла на вашем сервере. Злоумышленник может вставлять информацию о пути и использовать ваш скрипт для записи любого файла, который они хотят на сервере. Ваш '['type']' check is ** NOT ** security. Это бесполезно. mime типы тривиальны для подделывания. –

+0

Да, я на самом деле пробовал кучу, но не сделал это работать, поскольку я совершенно новый, я задушил изменить код и сделать его подходящим с моим .. – Aromefraise

ответ

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); 

} 

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

+0

В первый раз это хорошо, добавляет 0, но во второй раз это просто загрузка, ожидающая localhost .. Это ошибка: Неустранимая ошибка: превышено максимальное время выполнения 30 секунд (в то время как (file_exists ("filer /". $ id. "/". $ fnavn)) { $ fnavn = $ rawBaseName. $ counter. '.'. $ extension;};) – Aromefraise

+0

Ах, извините. Забыл обновить счетчик – SomeoneYouDontKnow

+0

Да! Большое вам спасибо за помощь! Это, наконец, работает! – Aromefraise

1

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

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 { 
+0

Что делать, если 'file (1) .txt' уже существует? – hek2mgl

+0

Это привело к тому, что имя файла получило (1) после него, но затем оно останавливается там, как его отслеживать? Во-вторых, теперь изменяется тип файла, так как это файл .pdf. Имя, которое изначально является «файлом», теперь получает «file.pdf1», что делает его нечитаемым – Aromefraise

+0

Хорошие баллы ... :) Я отредактирую его бит – Uxonith

1
<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); 
?> 
+1

Как правило, ответы гораздо полезнее, если они содержат объяснение того, что должен делать код, и почему это решает проблему, не представляя других. – zuazo