Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Уникальность имени файла.
 
 автор: DJ Paltus   (29.07.2005 в 14:34)   письмо автору
 
 

Нет ли какой-нибудь встроенной в РНР функции, позволяющей создать уникальное для директории имя файла? Что-нибудь типа "file89735cnjdsudyfejlasmdlk87878d".
Чтобы на лету переименовывать присланные файлы и размещать их в директорию и при этом исключить совпадение имен.

   
 
 автор: P@Sol   (29.07.2005 в 14:53)   письмо автору
 
   для: DJ Paltus   (29.07.2005 в 14:34)
 

md5 :))))))
нет такой функции...но что тебе мешает имене файла присваивать 14532972005? (часы.минуты.день.месяц.год)

   
 
 автор: JC_Piligrim   (29.07.2005 в 15:21)   письмо автору
 
   для: P@Sol   (29.07.2005 в 14:53)
 

Добавлю только, что стоит учитывать еще секунды и микросекунды, если сайт достаточно посещаем, и есть немалая вероятность, что скрипт, создающий такие файлы/папки может быть вызван в течении 119 секунд больше, чем одним пользователем.

   
 
 автор: JC_Piligrim   (29.07.2005 в 15:04)   письмо автору
 
   для: DJ Paltus   (29.07.2005 в 14:34)
 


<?php

$filename 
'file'.md5(microtime());

?>


И на ближайшие пару миллионов лет вам практически обеспечены уникальные имена файлов. ;)

   
 
 автор: sancho   (29.07.2005 в 15:13)   письмо автору
 
   для: JC_Piligrim   (29.07.2005 в 15:04)
 

И откуда вы только знаете все эти функции

   
 
 автор: JC_Piligrim   (29.07.2005 в 15:17)   письмо автору
 
   для: sancho   (29.07.2005 в 15:13)
 

Сам пользуюсь регулярно. ;))))

А как узнал - посмотрел, что md5 выдает очень уникальные значения, по сравнению с другими встроенными функциями, и вообще вещь универсальная, почитал немного про нее, и понял, что это незаменимая вещь в таких случаях.

P.S. http://www.php.net/manual/ru/ и http://www.softtime.ru/bookphp/help.php - форева! ;)

   
 
 автор: Akira   (29.07.2005 в 15:30)   письмо автору
 
   для: sancho   (29.07.2005 в 15:13)
 

Шифрование :) Это самые простые способы. Но вид файла не удобный.
Но учимся использовать встроенные для этого функция.
http://de2.php.net/manual/ru/function.tmpfile.php
http://de2.php.net/manual/ru/function.tempnam.php
Если, что не понятно спрашивайте.

   
 
 автор: P@Sol   (29.07.2005 в 15:35)   письмо автору
 
   для: Akira   (29.07.2005 в 15:30)
 

почитал...зачем усложнять жизнь?!

   
 
 автор: P@Sol   (29.07.2005 в 15:23)   письмо автору
 
   для: JC_Piligrim   (29.07.2005 в 15:04)
 

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

   
 
 автор: JC_Piligrim   (29.07.2005 в 15:28)   письмо автору
 
   для: P@Sol   (29.07.2005 в 15:23)
 

Для малопосещаемых проектов, конечно же можно! А вот, если, например, на частопосещаемом ресурсе два человека одновременно захотят закачать фотку с именем "Безимени-1.jpg", то, может возникнуть накладка. =))))))))))

   
 
 автор: P@Sol   (29.07.2005 в 15:33)   письмо автору
 
   для: JC_Piligrim   (29.07.2005 в 15:28)
 

идет проверка и говорится - "Попробуй еще разок" :))))))))))))))))

   
 
 автор: JC_Piligrim   (29.07.2005 в 15:36)   письмо автору
 
   для: P@Sol   (29.07.2005 в 15:33)
 

Не повезет же тем десяти-пятнадцати ребятам, которым вдруг взбрендит в голову в одно и то же время выложить свои "Безимени-1.jpg". =)))))))))) У кого-то непременно сдадут нервы. Надеюсь, это буду не я. =))))))))))

   
 
 автор: P@Sol   (29.07.2005 в 15:39)   письмо автору
 
   для: JC_Piligrim   (29.07.2005 в 15:36)
 

попробуй на след. день в этоже время:)))))))))

   
 
 автор: P@Sol   (29.07.2005 в 15:40)   письмо автору
 
   для: JC_Piligrim   (29.07.2005 в 15:36)
 

кстате...можно присваивать имя того кто закачал:)...он же не будет сразу 10 файлов закачивать с одинаковым названием

   
 
 автор: JC_Piligrim   (29.07.2005 в 15:46)   письмо автору
 
   для: P@Sol   (29.07.2005 в 15:40)
 

О! Отличное решение!

P.S. А еще можно присвоить текущее настроение, и то, что играет сейчас в WinAMP'е! =)))))

   
 
 автор: P@Sol   (29.07.2005 в 15:48)   письмо автору
 
   для: JC_Piligrim   (29.07.2005 в 15:46)
 

ОООООооогромное поле для мысли программеру:)

   
 
 автор: JC_Piligrim   (29.07.2005 в 15:51)   письмо автору
 
   для: P@Sol   (29.07.2005 в 15:48)
 

Главное, в этом поле не заблудиться! =)

Бывает, сядешь за задачу, и так разовьешь ее, что вместо функции для сложения двух чисел выходит универсальная операционная система... Вот только напишешь которую только к пенсии.....своего пра-пра-пра-пра-пра-пра-пра-пра-пра-пра-внука. =)

   
 
 автор: DJ Paltus   (29.07.2005 в 16:51)   письмо автору
 
   для: P@Sol   (29.07.2005 в 15:23)
 

Я вот подумал, что файл должен иметь что-то типа отпечатков пальцев... то есть, его имя должно быть сделано из его параметров. Какие параметры мы можем вынуть из картинки? (я все это время занимаюсь фотоальбомом).
-размеры х*у
-размер файла
-тип МИМЕ
-количество цветов - можем? или нет?
-какие-то еще специальные джпеговые параметры?
-дата создания, думаю, параметр ненадежный.

И если мы все это свалим в кучу и обрабоатем md5, мы получим уникальное имя файла, плюс вполне достоверную проверку на наличие ТАКОЙ ЖЕ ФОТОГРАФИИ.
То есть, файл второй раз уже не закачается и клоны не расплодятся.

Дайте мне, плиз, кто-нибудь, описание массива $HTTP_POST_FILES и все, что при помощи РНР можно вытащить из сведений о джпеге/гифе. Буду думать.

   
 
 автор: Akira   (29.07.2005 в 17:56)   письмо автору
 
   для: DJ Paltus   (29.07.2005 в 16:51)
 

Лучше использовать, то что придумали до нас.

<?
echo md5_file("chester.jpg");
echo 
"\n";
echo 
md5_file("chester1.jpg");
echo 
"\n";
echo 
md5_file("chester2.jpg");
?>

Файл chester.jpg и chester1.jpg возвращают одинаковый хэш.
Та, что два разных файла дадут одинаковый хэш близиться к нулю :)

   
 
 автор: Евгений Петров   (29.07.2005 в 18:01)   письмо автору
 
   для: DJ Paltus   (29.07.2005 в 16:51)
 

А зачем сваливать, если можно просто md5_file("имя_файла") и все та же достоверная проверка на наличие ТАКОЙ ЖЕ ФОТОГРАФИИ.

   
 
 автор: Евгений Петров   (29.07.2005 в 18:02)   письмо автору
 
   для: Евгений Петров   (29.07.2005 в 18:01)
 

Опередили!!! :)))

   
 
 автор: cheops   (29.07.2005 в 18:04)   письмо автору
 
   для: Евгений Петров   (29.07.2005 в 18:01)
 

Файлы бывают очень здоровые и тратится много время на вычисление их хэш-кода... правда его заранее можно вычислить, например, при загрузке на сервер.

   
 
 автор: Евгений Петров   (29.07.2005 в 18:07)   письмо автору
 
   для: cheops   (29.07.2005 в 18:04)
 

То что времени много это ещё терпимо, а вот то, что нагрузка на сервер большая - это уже плохо.

   
 
 автор: DJ Paltus   (29.07.2005 в 19:55)   письмо автору
 
   для: Евгений Петров   (29.07.2005 в 18:07)
 

насчет нагрузки на сервер... я предполагаю нечто следующее:
берем картиночицу, из нее выдираем максимум данных, и пишем их в строку. допустим, у нас есть разрешение 800*600, размер файла 156392 байт, миме-тип pjpeg. Такое совпадение достаточно редко, но хотелось бы добавить еще, скажем, количество цветов и что там еще бывет в служебных тегах jpeg. Пишем это дело в строку "800х600-pjpeg-156392-9548", потом берем хэш, для красоты и равной длины, md5("800х600-pjpeg-156392-9548"), что и будет именем файла. И коль файл с таким именем уже существует, мы говорим, мол, товарищ! эта картинка у нас уже есть. Вот тебе ссылка!
Ну, а если по ссылке идет вдруг такое совпадение, другая пикча, то мы даем возможность юзеру сделать насильное размещение фотографии.

   
 
 автор: JC_Piligrim   (29.07.2005 в 22:04)   письмо автору
 
   для: DJ Paltus   (29.07.2005 в 19:55)
 

Товарищи, ну зачем же изобретать велосипед?! =)))

Если еще раз внимательно просмотреть тему, можно увидеть, что я упомянул функцию microtime(). Эта функция возвращает текущее значение времени, в формате:

секунды.микросекунды date_UNIX_timestamp, то есть примерно следующее:

0.73088000 1122657140

где первое число - микросекунды таймера, а второе - количество секунд, прошедшее с 1980 года, так называемый формат UNIX timestamp. Вероятность того, что эти параметры когда-нибудь совпадут ПРАКТИЧЕСКИ равна нулю!!!. (Ну разве что, таймер на сервере умрет вместе с мамкой и процом, но тогда все эти проблемы с уникальными именами файлов станут не актуальными. ;)

Зачем тогда "лохматить бабушку", как говорил Задорнов? =)

Обрабатываем эту строку (которая при каждом обращении к скрипту, хоть 10 раз в секунду будет разная) md5(), и получаем уникальный хеш-код на ближайшие тысячилетия непрерывной работы.

То есть, код будет таким:


<?php

$имя_файла 
md5(microtime());

?>



ВСЁ!!!!

Ну, если очень хочется грязных извращений, то можно поступить следующим образом:


<?

$имя_файла 
md5($размер_файла_в_байтах $размер_файла_в_координатах $mime_тип_файла . $100-200_байт_из_середины_файла.$IP_адрес_пользователя $координаты_нажатия_кнопки_отправки_формы_если_кнопка_графическая $содержимое_html_файла_с_сайта_какой-нибудь_фондовой _биржи_так_как_котировки_акций_меняются_каждую_секунду $текущая_позиция_магнитных_головок_жесткого_диска_ на_сервере_хостинга_полученное_запуском_CGI_приложения_на_хостинге $свежая_порция_анекдотов_закодированных_base64 $несколько_байт_из_потока_интернет-радио $еще_парочка_извращений);

?>


Вот тогда можно быть точно уверенным, что такое совпадение, да еще и захешированное md5(), никогда не встретится!!! =))) Вот только кому это нужно? Зачем создавать себе проблемы?

microtime() выдает ТОЧНО ТАКОЙ ЖЕ УНИКАЛЬНЫЙ РЕЗУЛЬТАТ с минимальной нагрузкой на сервер!!! Собственно, можно даже md5() не применять, а использовать, после нескольких преобразований результат microtime() так, как есть (пробелы, точки подчистить)!!! Вот вам и уникальное имя файла!!!

P.S. "И не надо лохматить бабушку" (c) Михаил Задорнов.

   
 
 автор: DJ Paltus   (30.07.2005 в 15:08)   письмо автору
 
   для: JC_Piligrim   (29.07.2005 в 22:04)
 

Вы не обратили внимания, я же иду дальше. Я уже мечу не в то, чтобы сравнивать имя файла, проблема детская и успешно с помощью участников форума решена. Я же теперь исследую возможность найти уникальные признаки графического файла, чтобы проверять при загрузке наличие в деректории не картинки с таким же имененм, а картинки с таким же содержанием. Создана новая тема http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=5857&page=1, в которой я как раз и пытаюсь поставить вопрос о вытягивании из файла максимума значений параметров.

   
 
 автор: JC_Piligrim   (29.07.2005 в 22:29)   письмо автору
 
   для: DJ Paltus   (29.07.2005 в 16:51)
 

Зачем массив $HTTP_POST_FILES?


Вот:


После выбора в этом поле нужного файла и отправки формы (и загрузки на
сервер того файла, который был указан) РНР определит, что нужно принять
файл, и сохранит его во временном каталоге на сервере. Кроме того, в про-
грамме создадутся несколько переменных.

- $MyFile — имя временного файла на машине сервера, который содержит
данные, переданные пользователем. С этим файлом теперь можно вытво-
рять все что угодно: удалять, копировать, переименовывать, снова удалять...
- $MyFiie_name — исходное имя файла, которое он имел до своей отправки
на сервер.
- $MyFiie_size — размер закачанного файла в байтах.
- $MyFiie_type — тип загруженного файла, если браузер смог его опреде-
лить. К примеру, image/gif, text/html И Т. Д.

Как видим, префикс у всех созданных переменных один и тот же -
MyFiie_. Этот префикс состоит из имени элемента закачки в форме, к кото-
рому присоединен знак _.
(с) Дмитрий Котеров "Самоучитель PHP4"

Единственная проблема - старые версии PHP неправильно обрабатывают файлы, имена переменных которых в html-форме представляли собой ключ ассоциативного массива. То есть, имя было, скажем "picture[photo]".

$HTTP_POST_FILES решает эту проблему, в случае, если режим track_vars в php.ini включен, а что касается формата представленных в нем данных, лучший способ выяснить это - print_r()'нуть содержимое массива после отправки файлов. У себя я сделать этого, к сожалению, сейчас не могу, так как данный режим на моей машине отказывается в силу неизвестных мне причин включаться, несмотря на все поправки в php.ini. =(

   
 
 автор: tim   (20.09.2005 в 11:26)   письмо автору
 
   для: JC_Piligrim   (29.07.2005 в 22:29)
 

Всем привет, помогите начинающему. Искал везде так и не нашёл поэто вот решил спросить.
У меня директория /text/ там все текстовые файлы со статьями. имена файлов a1.txt, a2.txt, a3txt..... при добавлении текстового файла в директорию скрипт считывает документы выстраивает их по дате создания и выводит заголовок и часть текста, заголовок формирую в ссылку для открытия документа полностью в соседней части страницы.
Вопрос: как сделать так, чтобы при добавлении через форму текста в новый документ, документу присваивалось имя +1, т.е. а9.txt, a10txt.... ?

   
 
 автор: cheops   (20.09.2005 в 12:09)   письмо автору
 
   для: tim   (20.09.2005 в 11:26)
 

Под новые вопросы лучше заводить новые темы. Продолжение в теме по ссылке.

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=7623

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования