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

#php #javascript #mysql

#php #javascript #mysql

Вопрос:

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

Ответ №1:

Вы отметили свой вопрос с помощью PHP и MySQL.

  • Вы могли бы использовать функцию uniqid PHP для генерации уникальной строки
  • Вы могли бы использовать таблицу MySQL для хранения информации об изображениях и использовать ключ AUTO_INCREMENT в этой таблице, чтобы получить уникальное целое число, которое вы могли бы использовать в качестве имени файла

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

Ответ №2:

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

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

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

В конце используйте самое короткое и информативное уникальное значение, которое вы можете получить, например

 $file = "{$HOST}.{$TYPE}.{$TIMESTAMP}.{$DATAID}.{$EXT}.uploaded";
  

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

Ответ №3:

Вы можете использовать

 $image_name=('Your folder path/'. time () .'.'$extension);
  

для получения любого расширения изображения

  $extension = getExtension($filename);

    function getExtension($str) {
     $i = strrpos($str,".");
     if (!$i) { return ""; }
     $l = strlen($str) - $i;
     $ext = substr($str,$i 1,$l);
     return $ext;
  

}

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

    if (($extension != "jpg") amp;amp; ($extension != "jpeg") amp;amp; ($extension != "png") amp;amp;     ($extension != "gif")) 
    {
        echo '<h1>Unknown extension!</h1>';
        $errors=1;
    }else
             //your code to save image in folder.
  

Комментарии:

1. -1: Функция time () не защитит вас от одновременных загрузок.

Ответ №4:

Рассматривали ли вы возможность сохранения данных в базе данных?

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