Уникальные имена файлов php

уникальное имя файла php при загрузке

У меня есть форма обсуждения отправки с загрузкой изображения на моем веб-сайте. Теперь я хочу загрузить уникальное имя файла, когда пользователь отправляет свое изображение, чтобы я мог показать результат всех изображений и избежать дублирования имени файла. Как это сделать с php? Если вам нужен мой код процесса формы, я его загружу.

5 ответов

можно использовать uniqid() функция для создания уникального ID

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

Не уверен точно, как выглядит ваш код, но вы можете сделать что-то вроде этого:

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

лучшим вариантом IMO было бы использовать sha1_file он создаст уникальный хэш на основе содержимого файла. Это будет только сталкиваться, если его же изображение или хэш-столкновение, которое является 1 в 2^160 шанс. Вы можете избежать дублирования изображений таким образом, однако, поскольку вы создаете хэш из файла, он может быть медленнее.

другой вариант:tempnam он создаст временный файл с уникальная имя.

Примечание: если PHP не может создать файл в указанном параметре dir, он возвращается к системному умолчанию.

обратите внимание: если вы измените имя файла, оно может быть не уникальным.

Я думаю, что самым простым способом было бы сохранить имя изображения в поле базы данных, а затем, когда пользователь загружает свое изображение, чтобы проверить, что имя файла уникально, проверив его на существующие имена файлов. Вы можете использовать интерфейс ajax / jquery, если вы не хотите, чтобы пользователю пришлось ждать, пока форма будет отправлена, чтобы получить ошибку или приглашение изменить свое имя файла.

Источник

Генерация уникального имени файла на PHP

76a3ef7fe008a66fa38a54be0fc5a4189b

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

Самый простой вариант – использовать встроенную в PHP функцию uniqid() :

Усложним пример (придадим больше уникальности):

Если необходимо имя короче, чем 32 символа, то можно просто обрезать строку до нужной длины:

Если проект небольшой или даже средний, то вышеуказанные примеры вполне себе годятся для генерации уникальных имён файлов. Но, если проект сложный и очень много файлов загружается, то есть вероятность перезаписи какого-либо файла новым файлом при случайной генерации такого же имени для нового файла. Появляется проблема неконтролируемости уникальности файлов. Иными словами, встаёт необходимость проверки на отсутствие такого же файла. Приведу простой пример. Для удобства я соберу весь код в одном файле:

Здесь осуществляется проверка на существование файла. Если файл с таким именем уже существует, то генерируется следующее имя.

Или с проверкой на отсутствие файла с таким же именем:

Название файла будет примерно таким: uploads/7ce/824/286eeca87.jpg Причём uploads/7ce/824/ это вложенные директории. В примере указано, что если этих директорий нет, то их необходимо создать.

Источник

Генерация уникального имени файла в PHP проектах

18b79209ec614f9f459c397288afb112

C самых первых проектов, поддерживающих загрузку файлов на сервер, любой программист сталкивается с необходимостью генерации уникальных случайных имён для загруженных файлов. Рассмотрим несколько вариантов решения данной проблемы.

Предположим, мы должны сохранять все файлы в одну папку. Чтобы файлы не повторялись и чтобы не возникало проблем с кириллицей нам лучше давать им уникальные имена вида

Самый лёгкий вариант – это использование встроенной в PHP функции uniqid():

Эта функция вернёт случайную 13-символьную строку. Если же нужно делать имена длиннее, то можно использовать функции вычисления хэша от случайной строки:

Функция md5() генерирует 32-символьную строку. Можно, конечно использовать любую другую функцю. При желании можно установить любую длину от 1 до 32 обрезав md5-хэш функцией substr() :

Если нужно хранить файл с расширением, то его расширение можно легко приписывать к идентификатору:

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

Чтобы избежать перезаписи нам необходимо проверять папку на отсутствие такого же файла. Напишем функцию, избавленную от этого недостатка:

Рассмотрим пример загрузки изображения с использованием данной функции:

С помощью функции DFileHelper::getRandomFileName() мы генерируем уникальное имя файла для папки upload/images и используем это имя для загрузки. Теперь файлы никогда не перезапишутся, так как имена никогда не совпадут.

Не пропускайте новые статьи, бонусы и мастер-классы:

Как многим известно, для хранения настроек приложения в Yii выделен специальный раздел `params` в конфигурационном файле. Это решение достаточно простое, но оно не позволяет легко менять настройки самому пользователю в панели управления сайта. Очередной вопрос на русском форуме Yii натолкнул меня поделиться своим вариантом решения упомянутого там вопроса.

В комментариях к записи о HTML Purifier был задан вопрос о том, каким образом можно переделать внешние адреса на переход через промежуточную страницу на своём сайте. Сделаем функционал, обрабатывающий внешние ссылки в тексте и переадресующий их на страницу подтверждения перехода на другие сайты.

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

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

С микротаймом и мд5, коллизии никогда не будет по 1 простой причине 🙂
В одной папке есть лимит количества файлов, после которого просто система заглохнет читать папку, а удалять файлы в такой папке будет пыткой даже для СИшных приложений и будет очень дорогостоящей операцией для системы.

Увы, но это не причина.

Не знаю, правильно, или нет, но так в одной папке много не скопится 🙂

И такой вопрос: а если надо сохранить имена файлов (ещё и на русском языке)? Сервер корёжит имена при загрузке.

Да, кстати, лучше создавать папки по дате. Так многие CMS делают (тот же WordPress).

И касательно имён: можно хранить имя в ещё одной ячейке, а файлы отдавать через x-sendfile в Nginx с передачей оригинального имени.

Я делал проще с использованием TIME():

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

Увы, эта функция не припишет к имени файла расширение. После конкатенации расширения её также придётся оборачивать в этот же цикл do-while.

И зачем ему расширение?

Очень прошу, поменяйте хотя бы для первых блоков (с uniqid и md5(microtime)) описание, допишите, что этот способ использовать _нельзя_. Ну открывают же и копируют, не глядя.

А Вы изображения без расширений загружаете?

В Yii2 есть методы:

Для тех кто не любит MD5.

Посмотрел на код нашего юниора, который использует эту замечательную статью, вскрылся очередной косяк:

// ВОТ ТУТ ДРУГОЙ ПРОЦЕСС СОЗДАЕТ ФАЙЛ С ТАКИМ ЖЕ ИМЕНЕМ

Слушайте, ну уберите статью, ну пожалуйста. Она не имеет абсолютно никакого смысла и только запутывает людей. Пожалуйста, посмотрите в исходниках PHP, как работает tempnam (подсказка: через mkstemp), посмотрите, что такое mkstemp и как она отличается от mktemp. В качестве бонуса попробуйте осознать понятия «атомарность» и «параллельное выполнение».
Ваша статья в гугле висит на первых местах и несёт страдание в этот мир.

Да запросто. Если подскажете, как сгенерировать случайное имя с расширением – удалю.

Переработал ещё позавчера.

Иначе с цикла мы выйдем когда найдем файл с таким же именем? что нам как раз не нужно

Нет. Наоборот. Это цикл while, а не until.

В этой ситуации может произойти такое, что и для Клиента1, и для Клиента2 будет создано одно и тоже «уникальное» имя, но Клиент2 не узнает об этом, поскольку Клиент1 еще не произвел запись файла в каталог, а ведь лишь после этого метод file_exists() сможет определить, что файл с таким именем уже существует в директории.

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

Сейчаc от этого спасает только rand(0, 9999) в имени, что даёт крайне малую верятность этого события:

Можно повысить верхний предел до миллиона, что снизит возможность совпадения до одной миллионной.

Но всё равно создание пустого файла не спасёт, так как это «сразу же» тоже не будет мгновенным.

А разве так не надежнее будет?

чтобы исключить возможность ошибки надо просто содать отдельную дирректорию для файлов пользователя с именем ID

Я пользуюсь алгоритмом генерации файлов как у автора, только не проверяю директорию на наличие такого файла уже, какова вероятность что два файла записанные в разное время будут иметь одинаковый хеш?, плюс ко всему у меня у каждого юзера своя папка с файлами, название которой соответствуют id юзера, который уникальный в системе.

Вопрос, какова вероятность перезаписи файла в моем случаи, я хеш не обрезаю вообще

Источник

Как назначить уникальное имя файлу?

Задаю уникальное имя файла при помощи md5($id_будущего_файла_в_таблице.microtime(true));
Какова вероятность повторения md5 хэша? Я понимаю что крайне и крайне мала, но всё же.
И что посоветуете вместо md5? Сразу скажу, насколько я знаю, ЛЮБОЙ тип хэширования допускает коллизии.
И вообще, если хэшировать строку в данном случае глупо, предлагайте свои версии того, как назначить уникальное имя для файла, БЕЗ единого шанса на повторение.

Так как мы тут хардкорщики, я прошу вариант БЕЗ циклов. Слабо?

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Уникальное имя файла
Написал скрипт загрузки файла на сервер с последующим перемещением из временной папки на мой.

Как сделать проверку на уникальное имя процесса
Ребят, помогите! Вот код: package processcheker; import java.io.BufferedReader; import.

tickПередать имя файла в переменную, если имя каждый раз уникальное и содержит маску
Добрый день. В виду отсутствия информации в поиске, прошу помочь с вопросом по batch. Как.

Как назначить иконку исполняемому файлу приложения
Как в visual basic поставить иконку exe файлу, что бы не у ярлыка, а самого exe файла была иконка.

WebProgrammer1, Стандартный, дедовский способ. Но что если в одну и ту же микросекунду загрузят больше одного файла?

Если нет, то есть ли хотя бы нано таймер?
Ну и если вам, ребята, слабо, буду использовать циклы при повторении имени.
Только подскажите какой лучше, while?

И если сейчас php такого не умеет, скажите, как логичнее преобразовывать имя файла загруженного в то же время? Прибавить 1 единицу времени? Добавить рандомный символ?

Но я всё же надеюсь что кто то скажет как дать абсолютно уникальное и неповторимое имя.

Добавлено через 21 минуту

Вот это уже интересно.
Был файл pisun_tryasun1234
Загружаем файл «Моя звезда», и техническое имя файла pisun_tryasun12341
Следующий файл pisun_tryasun123411

Если это делать цифрами, например текущий последний файл 54, следующий 55, потом 56, но это позволяет всем проходящим мимо открывать любой пользовательский файл без каких либо проблем.

Например я знаю что все файлы хранятся в папке /upload/user_files
И я свободно вбиваю /upload/user_files/1(

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

Концепция неплохая, это действительно уникальное имя будет. Всегда! Даже если в одну и ту же нано секунду были отправлены запросы, чей то обработается первее, имя файла задастся, а имя следующего файла будет отталкиваться от предыдущего загруженного. Очень даже неплохо.
Только конечно при условии что php не способен обработать 2 абсолютно одновременно пришедших запроса.
Тогда они оба получили бы одно и то же имя. Что вообще вызвало бы крах всей логики.
Но насчёт этого я ничего незнаю и утверждать не берусь. Поверю на слово.

Можно ли как нибудь эту концепцию применить безопасно?
На уме только +1.$rand_line_long_8 но тогда имена файлов выглядели бы странновато конечно XD
1e8r79gt92n
223r7t68g31
3w34yoier9y
4rfsdnrhtiog
5sdkltjm4tt0

Ну или не рандомную строку, а как раз microtime(true).
Какие мысли насчёт имени и что важнее всего, что насчёт обработки данных php?

Интересно уж очень стало насчёт того как php обрабатывает запросы.
Пришло 2 запроса в одну и ту же долю секунды. Без единого различия, что php будет делать?
Зависнет? Выполнит по очереди? Выполнит их одновременно?

Источник

Уникальные имена файлов php

Выделяет имя файла из пути.
Синтаксис:

Функция basename() не проверяет существование файла. Она просто берет часть строки после самого правого слеша и возвращает ее.

Эта функция правильно обрабатывает как прямые, так и обратные слеши под Windows.

Выделяет имя каталога.
Синтаксис:

Если функции dirname() передать просто имя файла, она вернет «.», что означает «текущий каталог».

Генерирует уникальное имя файла в определенном каталоге.
Синтаксис:

Преобразует относительный путь в абсолютный.
Синтаксис:

Пытается переименовать oldname в newname.
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Пример использования функции rename()

Замечание: В версиях PHP ниже 4.3.3, функция rename() не могла переименовать файлы, находящиеся на другом разделе в ОС, основанных на *nix.
Замечание: Начиная с версии PHP 5.0.0, функция rename() также может быть использована с некоторыми обвёртками URL.

Замечание: Обвёртка, используемая в oldname ОБЯЗАНА совпадать с обвёрткой, используемой в newname.
Замечание: Атрибут context был добавлен начиная с версии PHP 5.0.0.

Находит файловые пути, совпадающие с шаблоном (PHP 4 >= 4.3.0, PHP 5)

Функция glob() ищет все пути, совпадающие с шаблоном pattern согласно правилам, используемым в функции glob() библиотеки libc, которые похожи на правила, используемые большинством распространённых оболочек. Раскрытие тильды или подстановки параметров не совершаются.

Возвращает массив, который содержит совпадающие файлы/директории или FALSE в случае ошибки.

Замечание: В версиях ниже PHP ниже 4.3.3 GLOB_ONLYDIR был не доступен в Windows и других системах, не использующих библиотеку GNU C.

Удобный способ, как при помощи glob() можно заменить opendir() и её друзей.

Результат будет примерно таким:

Замечание: Эта функция не применима для работы с удаленными файлами, поскольку файл должен быть доступен через файловую систему сервера.

Возвращает информацию о пути к файлу (PHP 4 >= 4.0.3, PHP5)

pathinfo() возвращает ассоциативный массив, который содержит информацию о пути path. Возвращаемый массив состоит из следующих элементов: dirname, basename и extension.

Вы можете указать, какие элементы будут возвращены при помощи необязательного параметра options. Он состоит из PATHINFO_DIRNAME, PATHINFO_BASENAME, PATHINFO_EXTENSION и PATHINFO_FILENAME (появилась в PHP 5.2.0). По умолчанию возвращаются все элементы.

Источник

Моя дача
Adblock
detector