Каким образом можно создать уникальное имя для изображения, которое загружает мой пользователь?
Я не хочу иметь дубликатов, поэтому что-то вроде MD5 ($ filename) не подходит.
Есть идеи?
как уже упоминалось, я считаю, что лучший способ создать уникальное имя файла – просто добавить 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-адрес будет выглядеть так:
Плюсы:
минимизированная угроза столкновения
хорошая производительность при поиске файлов (не много файлов в 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)