Создание уникальных имен изображений

Каким образом можно создать уникальное имя для изображения, которое загружает мой пользователь?

Я не хочу иметь дубликатов, поэтому что-то вроде MD5 ($ filename) не подходит.

Есть идеи?

Related of "Создание уникальных имен изображений"

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

$image_name = time()."_".$image_name; 

Захватите расширение файла из загруженного файла:

 $ext = pathinfo($uploaded_filename, PATHINFO_EXTENSION); 

Захватите время до второго: time()

Возьмите некоторую случайность: md5(microtime())

Преобразование времени в базу 36: base_convert (time(), 10, 36) – база 36 сжимает 10-байтовую строку до примерно 6 байтов, чтобы использовать больше случайной строки, которая будет использоваться

Отправляйте весь лот в виде строки 16 символов:

 $unique_id = substr( base_convert( time(), 10, 36 ) . md5( microtime() ), 0, 16 ) . $ext; 

Я сомневаюсь, что когда-нибудь столкнется – вы даже не можете усечь его, если не возражаете очень долгое имя файла.

Если вам действительно нужно имя файла (это не совсем ясно из вашего вопроса), я бы использовал tempnam() , который:

Создает файл с уникальным именем файла с правами доступа, установленными на 0600, в указанном каталоге.

… и пусть PHP делает тяжелый подъем разработки уникальности. Обратите внимание, что, а также возвращая имя файла, tempnam() фактически создает файл; вы можете просто перезаписать его, когда вы отбрасываете файл изображения.

Вы можете взять хэш (например, md5, sha) самих данных изображения. Это также поможет идентифицировать повторяющиеся изображения (если это байт за байт, то же самое). Но любая достаточно длинная строка случайных символов будет работать.

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

 /image/0/1/012345678/original-name.jpg 

Таким образом, имя файла выглядит нормально, но оно по-прежнему уникально.

Я бы порекомендовал sha1_file() над md5_file() . Он менее подвержен столкновениям. Вы также можете использовать hash_file('sha256', $filePath) чтобы получить еще лучшие результаты.

Возможно, http://php.net/manual/en/function.uniqid.php ?

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

Для коротких имен:

 $i = 0; while(file_exists($name . '_' . $i)){ $i++; } 

ПРЕДУПРЕЖДЕНИЕ: это может быть неудачно на многопоточном сервере, если два пользователя одновременно загружают изображение с тем же именем. В этом случае вы должны указать md5 имени пользователя.

LOL существует около 633400000000000000000000000000000000000000000000000000 возможность, что md5 может производить плюс вы могли бы использовать просто чтобы быть на безопасной стороне

 $newfilename = md5(time().'image'); if(file_exists('./images/'.$newfilename)){ $newfilename = md5(time().$newfilename); } //uploadimage 

Насколько велика вероятность того, что два пользователя загружают изображение с тем же именем в тот же микросекунда?

пытаться

  $currTime = microtime(true); $finalFileName = cleanTheInput($fileName)."_".$currTime; // you can also append a _.rand(0,1000) in the end to have more foolproof name collision function cleanTheInput($input) { // do some formatting here ... } 

Это также поможет вам отслеживать время загрузки файла для анализа. или могут сортировать файлы, управлять файлами.

Для хорошей производительности и уникальности вы можете использовать такой подход:

  • файлы будут храниться на сервере с именами, такими как md5_file($file).jpg

  • каталог для хранения файла в определении из имени файла md5, путем удаления первых двух символов (первый уровень) и второго второго (второго уровня):

    uploaded_files \ 30 \ c5 \ 30 c5 67139b64ee14c80cc5f5006d8081.pdf

  • создать запись в базе данных с file_id, исходное имя файла, загруженный идентификатор пользователя и путь к файлу на сервере

  • на стороне сервера создайте скрипт, который получит роль обеспечения загрузки – он получит файл по id из db и выведет его содержимое с исходным именем файла, предоставленным пользователем (см. пример php codeigniter download_helper ). Поэтому URL-адрес будет выглядеть так:

    http://site.com/download.php?file=id


Плюсы:

  • минимизированная угроза столкновения

  • хорошая производительность при поиске файлов (не много файлов в 1 каталоге, не так много каталогов на одном уровне)

  • сохранены исходные имена файлов

  • вы можете настроить доступ к файлам по сценарию на стороне сервера (проверить сеанс или файлы cookie)

Минусы:

  • Хорошо для небольших файлов, потому что перед тем, как пользователь может загрузить файл, сервер должен прочитать этот файл в памяти

попробуйте этот формат файла:

 $filename = microtime(true) . $username . '.jpg'; 

Что-то вроде этого может сработать для вас:

 while (file_exists('/uploads/' . $filename . '.jpeg')) { $filename .= rand(10, 99); } 

Готовый код:

 $file_ext = substr($file['name'], -4); // eg'.jpg', '.gif', '.png', 'jpeg' (note the missing leading point in 'jpeg') $new_name = sha1($file['name'] . uniqid('',true)); // this will generate a 40-character-long random name $new_name .= ((substr($file_ext, 0, 1) != '.') ? ".{$file_ext}" : $file_ext); //the original extension is appended (accounting for the point, see comment above)