2010-09-03 4 views
8

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

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

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

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

а) Название фотография б) Краткое изображение с) Изображением детали

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

Я использую для сценария ниже в настоящее время только для перемещения и сохранения имени файла с помощью пути с использованием 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

и так далее

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

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

ответ

2

Ну, вот одно из возможных решений:

  1. Получить загруженное имя файла из $_FILES["ns_pic_title"]["name"] и отдельного расширения, или если мы говорим только о файлах изображений получить тип изображения с getimagesize($_FILES["ns_pic_title"]["tmp_name"]);
  2. Проверьте вашу базу данных для максимального ид записи изображения и сделать в $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)

Надеется, что это имеет смысл и помогает ,

+0

Это лучшая альтернатива предложению blob, в то же время делая использование id/primary key из базы данных. Я использовал это несколько раз сам. – Treffynnon

+1

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

+0

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

2

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

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

  • Use mysql to store the image content in a blob. Таким образом вы получите доступ к содержимому изображения с помощью идентификатора вместо имени пути.

+4

Я действительно не рекомендую хранить изображения вашего сайта в базе данных. Проблемы с производительностью могут возникнуть в базе данных, а также вам не хватает кэширования изображений. – janosrusiczki

+1

Я бы использовал функцию tempnam, и я обязательно избегу использовать blob, я раньше использовал blob и попал в проблему с производительностью. +! за рекомендацию темпнам спасибо. –

+0

Согласен, я только добавил предложение blob для полноты. –

2

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

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

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

+0

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

0

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

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

Смежные вопросы