#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:
Рассматривали ли вы возможность сохранения данных в базе данных?
Если вы сможете; вы избавитесь от необходимости иметь уникальное имя файла и проблем, связанных с несинхронизацией файлов и базы данных.