Переименование файла PHP

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

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

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

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

a) Изображение заголовка b) Краткое изображение c) Детальное изображение

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

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

$ns_pic_title_loc= $_FILES["ns_pic_title"]["tmp_name"]; $ns_pic_title_name = $_FILES["ns_pic_title"]["name"]; move_uploaded_file($ns_pic_title_loc, $ns_title_target.$ns_pic_title_name) or die(mysql_error()); 

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

a) В каталоге заголовков файл должен храниться как. title_1.jpg title_2.jpg title_3.jpg title_4.jpg

и так далее

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

заранее спасибо

Ну, вот возможное решение:

  1. Загрузите имя файла из $_FILES["ns_pic_title"]["name"] и отдельное расширение ИЛИ, если мы говорим только о файлах изображений, получим тип изображения с getimagesize($_FILES["ns_pic_title"]["tmp_name"]) ;
  2. Проверьте свою базу данных на максимальный идентификатор записей изображения и $file_name переменную $file_name 'title_'.($max_id + 1)
  3. На этом этапе у вас должно быть $ file_name и $ file_extension, поэтому move_uploaded_file($_FILES["ns_pic_title"]["tmp_name"], $ns_title_target.$file_name.'.'.$file_extension)

Надеюсь, это имеет смысл и помогает.

Есть несколько хороших вариантов с различными плюсами и минусами.

  • Используйте tempnam php при перемещении файла и сохраните путь в базе данных mysql. tempnam генерирует уникальное имя файла.

  • Используйте mysql для хранения содержимого изображения в блобе . Таким образом вы получите доступ к содержимому изображения с помощью идентификатора вместо имени пути.

Вместо того, чтобы иметь логику, чтобы выяснить, что такое последнее имя изображения, и вычислить приращение следующего числа, почему бы просто не использовать функцию tempnam () PHP ? Он генерирует уникальное имя с префиксом по вашему выбору (т. Е. «Title», «brief», «detail»). Вы также можете просто добавить временную метку к имени файла – если у вас не так много админов, загружающих фотографии в одно и то же время, которые должны обрабатывать большинство конфликтов имен.

Поскольку ваши фотографии будут отсортированы в title , brief и detail каталогах, на самом деле не обязательно называть каждое изображение title_* , brief_* и detail_* , правильно? Если он находится в каталоге заголовков, то это, очевидно, заголовок.

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

Поскольку вы храните ссылки в БД, я бы предпочел просто md5 datetime и использовать это для имени файла и также сохранить имя файла диска в БД. Неважно, какое имя записывается на диск, пока вы можете указать на него с уникальным именем в БД.

Я использую эту методологию, и ни в одном из моих тестов имя диска (md5 из datetime) никогда не требует нескольких попыток.