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

tempnam

(PHP 4, PHP 5, PHP 7, PHP 8)

tempnam — Создаёт файл с уникальным именем

Описание

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

Список параметров

Директория, где будет создан временный файл.

Префикс имени генерируемого файла.

Замечание: Используются только первые 63 символа префикса. Windows по-прежнему использует только первые три символа префикса.

Возвращаемые значения

Возвращает имя нового временного файла (вместе с путём) или false в случае неудачи.

Список изменений

ВерсияОписание
7.1.0tempnam() теперь выдаёт уведомление при возврате во временный каталог системы.

Примеры

Пример #1 Пример использования функции tempnam()

// здесь мы чего-нибудь делаем

Примечания

Смотрите также

User Contributed Notes 23 notes

Warning: tempnam() [function.tempnam]: open_basedir restriction in effect.
File() is not within the allowed path(s): (/var/www/vhosts/example.com/httpdocs:/tmp)

What works is this:

= tempnam ( sys_get_temp_dir (), ‘FOO’ ); // good
?>

Please note that this function might throw a notice in PHP 7.1.0 and above. This was a bugfix: https://bugs.php.net/bug.php?id=69489

You can place an address operator (@) to sillence the notice:

?>

Or you could try to set the «upload_tmp_dir» setting in your php.ini to the temporary folder path of your system. Not sure, if the last one prevents the notices.

tempnam() function does not support custom stream wrappers registered by stream_register_wrapper().

For example if you’ll try to use tempnam() on Windows platform, PHP will try to generate unique filename in %TMP% folder (usually: C:\WINDOWS\Temp) without any warning or notice.

?>

ouputs:
———————
PHP 5.2.13
node exists: 1
node is writable: 1
node is dir: 1
tempnam in dir: C:\Windows\Temp\tmp1D03.tmp

If you want to create temporary file, you have to create your own function (which will probably use opendir() and fopen($filename, «x») functions)

Be careful with you forward and back slashes. Innocent looking code like this.

i.e. /Program Files/Apache Group/Apache2/htdocs/sasdap/uploads/\TMP3D.tmp

Must. remember. to. use. backslashes.

I want to guarantee that the file will be created in the specified directory or else the function should return FALSE, I have a simple function that works, but I am unsure if its a potential security issue.

This function returns just the name of the temporary file in the specified directory, or FALSE.

>Under UNIX (where you can rename onto an extant file and so I used link), you will have to remove both the link and the link’s target.

The «newtempnam» recipe provided below (posted by «tempnam» on » 23-Jul-2003 08:56″) has at least one race condition. The while loop checks to make sure that the file in question doesn’t exist, and then goes and creates the file. In between the existence test and the fopen() call there is an opportunity for an attacker to create the file in question.

This is a classic race-condition, and while it seems difficult to exploit there are a number of well-known attacks against this kind of sloppy file creation.

The atomic primitives necessary to implement secure file creation are not available at the language level in PHP. This further underscores the need for PHP-language developers to rely on the language’s security primitives (including tempnam() and tempfile()) instead of rolling their own.

Creating a temporary file with a specific extension is a common requirement on dynamic websites. Largely this need arises from Microsoft browsers that identify a downloaded file’s mimetype based on the file’s extension.

No single PHP function creates a temporary filename with a specific extension, and, as has been shown, there are race conditions involved unless you use the PHP atomic primitives.

I use only primitives below and exploit OS dependent behaviour to securely create a file with a specific postfix, prefix, and directory. Enjoy.

return false ;
>
?>

The isWindows function is mostly left as an exercise for the reader. A starting point is below:

Источник

Уникальные и временные имена файлов в PHP?

Мне просто нужно указать имя во временной файловой системе (используя sys_get_temp_dir()), который не будет конфликтовать с кем-то, w370 > того же пользователя, вызывающего script более одного раза.

ОТВЕТЫ

Ответ 1

Я использовал uniqid() в прошлом для создания уникального имени файла, но фактически не создавал файл.

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

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

Ответ 2

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

I.e., рассмотрим эту последовательность:

PHP tempnam() фактически вызывает систему mkstemp под капотом (что для Linux. заменит функцию «лучшей практики» для других ОС), которая проходит через такой процесс:

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

Ответ 3

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

Ответ 4

Рассмотрим использование uuid для имени файла. Рассмотрим уницидную функцию. http://php.net/uniqid

Ответ 5

Другая альтернатива, основанная на ответе @Lusid с отказоустойчивостью максимального времени выполнения:

Дополнительная информация:

Ответ 6

Лучше, если вы используете временную метку unix с идентификатором пользователя.

Ответ 7

Моя идея состоит в том, чтобы использовать рекурсивную функцию, чтобы увидеть, существует ли имя файла, и если это так, перейдите к следующему целому числу:

Источник

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

уникальные имена файлов php. Смотреть фото уникальные имена файлов php. Смотреть картинку уникальные имена файлов php. Картинка про уникальные имена файлов php. Фото уникальные имена файлов php

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

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

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

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

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

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

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

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

Источник

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

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

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

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

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

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

уникальные имена файлов php. Смотреть фото уникальные имена файлов php. Смотреть картинку уникальные имена файлов php. Картинка про уникальные имена файлов php. Фото уникальные имена файлов phpПередать имя файла в переменную, если имя каждый раз уникальное и содержит маску
Добрый день. В виду отсутствия информации в поиске, прошу помочь с вопросом по 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). По умолчанию возвращаются все элементы.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *