Как предотвратить переопределение существующих файлов с увеличением имени файла?

Я пробую свои силы в простом PHP-сценарии загрузки файлов с небольшой проверкой правильности файла. Это простой пример W3C с добавленным циклом while, чтобы проверить, существует ли файл, а затем добавить приращение к концу имени файла (непосредственно перед расширением файла).

Сценарий работает, но будет производить только 1 шаг. Например, я загружаю файл с именем «test.jpg», он загружает, я повторно загружаю тот же файл, и сценарий создает «test1.jpg» — но после этого сценарий будет просто переписывать «test1.jpg» !

Что я тут не так делаю?

<?php
$allowedExts = array("ai", "esp", "jpg", "jpeg", "png", "tiff");
$temp = explode(".", $_FILES["file"]["name"]);
$name = pathinfo($_FILES["file"]["name"], PATHINFO_FILENAME);
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$i = '';

if ((($_FILES["file"]["type"] == "image/ai")
|| ($_FILES["file"]["type"] == "image/esp")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/tiff"))
&& ($_FILES["file"]["size"] < 50000000)
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
} else
{
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
while(file_exists("upload/" . $_FILES["file"]["name"] . $i)) {
$i++;
}

$basename = $name . $i . '.' . $extension;
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $basename);
} else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
}
}
} else
{
echo "Invalid file";
}
?>

1

Решение

Прежде всего, вы должны начать $i переменная со значением 0 не '' (пустой строки).

После этого вы можете проверить

if(file_exists("upload/" . $name . $i . '.' . $extension)) { /* .... */ }

Потому что вы перемещаете файл в

$basename = $name . $i . '.' . $extension;

после этого. Так что если вы загружаете test.jpg Вы проверяете, если upload/test.jpg уже существует. Если да, вы идете в whileи проверка файла upload/test.jpg1 уже существует. Если нет, то вы перемещаете загруженный файл в upload/test1.jpg,

В следующий раз вы проверите еще раз, если файл upload/test.jpg1 уже существует. И это не так.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]