Jump to content
  • 0

Исключить перезапись файла


Zzz_
 Share

Question

Имеется простая форма:

<?php
// Каталог, в который мы будем принимать файл:
@mkdir("upload", 0777);
$uploaddir = './upload/';
$uploadfile = $uploaddir.basename($_FILES['an_file']['name']);

move_uploaded_file($_FILES["an_file"]["tmp_name"], "./upload/".$_FILES["an_file"]["name"]);

// Выводим информацию о загруженном файле:
echo "<h3>Информация о загруженном на сервер файле: </h3>";
echo "<p><b>Оригинальное имя загруженного файла: ".$_FILES['an_file']['name']."</b></p>";
echo "<p><b>Mime-тип загруженного файла: ".$_FILES['an_file']['type']."</b></p>";
echo "<p><b>Размер загруженного файла в байтах: ".$_FILES['an_file']['size']."</b></p>";
echo "<p><b>Временное имя файла: ".$_FILES['an_file']['tmp_name']."</b></p>";
?>

Как исключить перезапись файла?!

и как переименовать файл в произвольное имя, вида: 02jfas!?

Link to comment
Share on other sites

13 answers to this question

Recommended Posts

  • 0

Проверить на существование file_exists, в случае если такой файл есть просто перезаписать значение в массиве files['name'] на другое, допустим прибавив к сущ. названию рандомное число rand. Такой простой вариант не пробывали?

  • Like 1
Link to comment
Share on other sites

  • 0

как же не пробовал, пробовал но этот вариант не подходит...

Допустим пользователь загружает файл One.jpg

php реагирует, ага существует... я его переименую в one1.jpg...

вроде все хорошо.....

и другой пользователь загружает файл one.jpg

php реагирует, ага существует... я его переименую в one1.jpg...

и замещает уже ранее созданный one1.jpg

Link to comment
Share on other sites

  • 0

Процитирую сам себя:

прибавив к сущ. названию рандомное число rand

Теперь прочитаем про ф-ию rand. Напишем код, примерно такой:

function randomName() {
$fileName = $_FILES['name'];
if(file_exists($fileName)){
$fileName = $fileName . rand(1, 999);
randomName();
}else {
//Кусок кода, если имя не совпало
}
}
randomName();

Вот такой примерный код(набросок, который может не работать), только я не помню $_FILES['name'], возвращает имя файла с расширением или нет.

Можно написать нечто более извращенное, например прибавляющие цифры в конце файла на +1.

Edited by moron
  • Like 1
Link to comment
Share on other sites

  • 0

Да,я и изначально понял что вы имели ввиду, просто смотрите в чем суть проблемы с этим скриптом...

Не 100% вариант!

Т.к. рандомное число может быть одно и тоже присвоено, хоть и шанс 1 на 10000000, но ведь может!?

А как исключить такую возможность, тобишь 100% недопустить перезапись!?

Edited by Zzz_
Link to comment
Share on other sites

  • 0
А как исключить такую возможность, тобишь 100% недопустить перезапись!?

Рекурсия >,<.Там есть черт ее блин побери рекурсия. :devil: Каждый раз, когда мы прибавляем к переменной цифры, мы возвращаемся в начало и делаем вновь проверку на существование файла с таким именем, мы ищем уже не исходное имя, а имя с цифрами и если находим, то прибавляем опять случайное число и до бесконечности....

Ну щас попробую залабать что-нибудь другое..

Edited by moron
  • Like 1
Link to comment
Share on other sites

  • 0

Памяти не хватет:

Allowed memory size of 25165824 bytes exhausted...

почему!?

<?php
function randomName() {
$uploaddir = './upload/';
$fileName = $_FILES['file']['name'];
if(file_exists($uploaddir.$fileName)){
$fileName = rand(1, 999).$fileName;
randomName();
}else {
move_uploaded_file($_FILES["file"]["tmp_name"], $uploaddir.$fileName);
}
}
randomName();
?>

Edited by Zzz_
Link to comment
Share on other sites

  • 0
Ну щас попробую залабать что-нибудь другое..

Так вот, я сделал:

 //имя файла сам получишь, у меня это будет 'test21'
$fileName = 'test21';//имя файла должно быть без расширения
function incrementFileName() {
if (file_exists($fileName)){
$pattern = '/[0-9$]+/'; // шаблон для регулярок, ищет цифры в конце строки
$result = preg_match ($pattern, $fileName, $arrayName);//регулярка:ищем цифры в конце, если нашли пишем в массив
if ($result = 1){//если цифры есть, то
$incName = $arrayName[0] + 1;//прибавляем к уже полученному значению +1
$fileName = preg_replace($pattern, $incName, $fileName);// делаем замену
incrementFileName(); //рекурсия
}else{//в случае если мы вообще не нашли цифры, то:
$fileName = $fileName.'1';//прибавим к названию 1
}
}
//блок кода, если мы добрались сюда, имя уже уник.
}
?>

Памяти не хватет:

Allowed memory size of 25165824 bytes exhausted...

почему!?

Посмотри настройки php.ini посмотри в параментры memory_limit и upload_max_filesize, так же если можешь приведи всю строку,там может указали на какой строке все ломается например:

Allowed memory size of 134217728 bytes exhausted (tried to allocate 41 bytes) in Z:\..\.. on line 18. Попробуй загрузить файл размером меньше и проверь что будет, возможно что мы держим в памяти большой файл. Без моего скрипта файлы загружались без ошибок?

Edited by moron
  • Like 1
Link to comment
Share on other sites

  • 0

Имя файла собирай через хэш некоторых байтов этого файла (только не первых, заголовки у однотипных файлов могут быть одинаковые), добавляя к нему время загрузки.

  • Like 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy