Какую вы используете структуру для хранения изображений?

Хочу сделать хранилище для изображений, но не могу подобрать архитектуру :) мало опыта, только придумал вот такое, а именно по дате например /p/2016/12/03/23/45/12/имя.jpg
но я собираюсь хранить не только оригинал, а ещё 200, 400 px width
как лучше все это сделать ? для отдачи юзаю nginx, пример url (http://img.project.loc/p/2016/12/03/23/45/12/имя.jpg) получается для этого же изображения, но только width 200 будет вот такой url http://img.project.loc/p/2016/12/03/23/45/12/имя_2...
Может что-то не правильно, подскажите :)

А как у вас это устроенно ?
  • Вопрос задан
  • 710 просмотров
Пригласить эксперта
Ответы на вопрос 8
trevoga_su
@trevoga_su
но я собираюсь хранить не только оригинал, а ещё 200, 400 px width
cloudinary.com

мало опыта, только придумал вот такое, а именно по дате например /p/2016/12/03/23/45/12/имя.jpg
не надо изобретать велосипед
md5 от имени файла + соль какая-нибудь
получаем что то типа 2cb126f9bd4e36cc8818183c785879d7.jpeg
далее пишем скрипт который создает нужное кол-во уровней:

/i/150x100/2/c/b/2cb126f9bd4e36cc8818183c785879d7.jpeg

На, вот моя приблуда для генерации

$directory_generator = new Krugozor_Utility_Upload_DirectoryGenerator(/* имя загруженного файла */);

// создали директорию в THUMBNAIL_150x100...
$directory = $directory_generator->create(DOCUMENTROOT_PATH . Krugozor_Registry::getInstance()->UPLOAD['THUMBNAIL_150x100']);

// отресайзили...
$creator = Krugozor_Thumbnail_Factory::create(
	DOCUMENTROOT_PATH . Krugozor_Registry::getInstance()->UPLOAD['THUMBNAIL_ORIGINAL'] . $upload->getFileNameWithExtension(), 
	$directory . $upload->getFileNameWithoutExtension()
);
$creator->setResizedWidth(150);
$creator->setResizedHeight(100);
$creator->resizeFixed();

// http-путь до картинки
$this->getView()->path_to_image = $directory_generator->getHttpPath() . $creator->getFileNameWithExt();
Ответ написан
DJZT
@DJZT
Laravel - code for you
/images/users/avatars/lksdhg324nk54h.jpg
/images/users/avatars/lksdhg324nk54h-200x200.jpg
/images/users/avatars/lksdhg324nk54h-400x400.jpg

/images/posts/kjnh345jkb43jb.jpg
/images/posts/kjnh345jkb43jb-200x200.jpg
/images/posts/kjnh345jkb43jb-400x400.jpg


Если хотите ещё нормальные названия иметь - то в БД заведите таблицу, где будете хранить оригинальное название. Всякие описания и доп инфу и ссылаться на файл в файловой системе. Но хранить не весь путь, а либо от корня images/ .... или images/posts/ .....
Но в первом случае вам необходимо будет ещё в бд хранить тип объекта, к которому файл относится, что бы подставлять users или posts и тд

UPD

Ещё делал структуру, когда к одному объекту относится только одна картинка.

/images/users/user_id.jpg
ну и тд
Тогда БД не нужна и вы всегда знаете, какую картинку искать. С размерами аналогично добавьте в путь папку

/images/users/300/user_id.jpg
/images/users/600/user_id.jpg
Ответ написан
bingo347
@bingo347
Crazy on performance...
Генерирую uuid - например 39c807bc-5b1f-11e6-95a6-a3eadeba2e44

На диске будет так:
images/39c807bc/5b1f/11e6/95a6/a3eadeba2e44.jpg
images/39c807bc/5b1f/11e6/95a6/a3eadeba2e44-small.jpg
images/39c807bc/5b1f/11e6/95a6/a3eadeba2e44-preview.jpg

а так же запись в БД с этим же id
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
вот тут

как уже не раз написали - оригниналы - в md5, влооженность директорий- две

всего дает 65536 директорий с 65536 макс файлов в каждой

достаточно для карьеры
Ответ написан
@dev400
можно по хэшу из файла сделать уникальную структуру и уникальное имя
Ответ написан
webinar
@webinar
Учим yii: https://youtu.be/-WRMlGHLgRg
/ images / имя категории(goods, redactor, user и т.д.) / год / размерфото('400x', '200x200', 'x1000' и т.д.) /хеш из id товара и т.д. .jpg

Можно выбрать все фото определенного размера без обращения в базу
Можно грохать старые фото
Более приятный, с точки зрения seo путь
Легко написать универсальный скрипт, который раскладывает и ресайзит фото для этой структуры
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Общий вид:
/[00-FF]/[00-FF]/[00-FF]/[00-FF]/[00-FF]/[00-FF]/[00-FF]/[00-FF]/[X]x[Y]/imgName.hash.ext

Пример хранения:
/5F/27/4C/8E/39/800x600/foto25.da4c2f.jpg
Пример вставки:
5F274C8E39_800x600_foto25.da4c2f.jpg
Хэш можно формировать на основе timestamp, пути хранилища до файла и "соли".
Ответ написан
@Sunsh1ne
Только недавно интересовался этим вопросом.
Уточню, для начала, что я пользуюсь готовым решением для работы с изображениями, и вам советую)
Сделал так:
1. Надо определится, сколько изображений будет в перспективе проекта.
Если будет 100 и через 5 лет существования проекта, то тогда ничего сложного изобретать не надо.
Если же больше, то тут нужно будет раскидывать их по папкам.
Ориентировочно для себя, я прикинул, что у меня в папке будет хранится примерно 20 фотографий.
А в проекте, я для себя установил планку в примерно 9000 изображений + их копии 300х200. и тут подсчёты.
9000*2/20 = 900 папок.
На самом деле 20 фотографий это даже маловато... Но эту цифру я выбрал по личным соображениям.
Такой код генерации:
$rand_int = rand(1,5);
$rand_md5 = md5(str_random(rand(6,15)));
$dir = '/images/uploads/minerals/' . $rand_int . '/' . $rand_md5[0] . '/' . $rand_md5[1] . '/';

Если посчитать потенциальные папки последнего уровня, то получится 1280. Вроде)) Мне надо столько как раз с запасом.
Как это получилось:
По коду понятно, что после папки minerals будет папка с именем в промежутке от 1 до 5.
Далее будет папка с именем в промежутке символов md5 хэша, а то есть: 0123456789abcdef.
Если я не ошибаюсь!!..
и имя последней папки случайно в том же самом промежутке символов.
Итого 5*16*16 = 1280. Потенциальных, заметьте, папок.
Все пути сохраняются в бд. И оригинального и превью изображений.
Можно играться с количеством вложенных папок, со словарём для генерации, не ограничиваясь только символами md5, можно имена папкам давать из 2-х символов и больше. Всё зависит от ваших потребностей, я лишь показал способ.
Если в названии папки будет 2 символа и больше, то считается по другому.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы