Архитектура загрузки изображений

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Аватара пользователя
sapgv
Сообщения: 164
Зарегистрирован: 2013.05.27, 21:41

Архитектура загрузки изображений

Сообщение sapgv »

Всем привет ! Столкнулся с вопросом построения архитектуры веб приложени, а именно как и где хранить загруженые картинки

рабочий вариант загрузки изображений:http://www.yiiframework.ru/doc/cookbook ... .fat.model

Но вот возникают вопросы:
1 например а каждого пользователя будет аватар, где хранить аватарку ? в папке аватарок ? или для каждого пользователя создавать папку и в ней хранить изображения для этого пользователя ?
2 у каждого пользователя может быть несколько статей, нужно загружать изображения для этих статей, вопрос тот же - общую папку делать или папку изображений пользователя ?
3 буду рад выслушать другие варианты загрузки изображений (отличающийся от ссылки выше)

как это вообще обычно реализовывают ?
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: Архитектура загрузки изображений

Сообщение lancedevnull »

храните как угодно, на граблях научитесь, главное делайте в моделях методы по типу getAvatarImage(), getPostImage которые брали бы путь с какойто переменной, а уж поменять потом будет без проблем все енто дело, а вообще все зависит от кол-ва картинок в 1 папке, и это больше к минусам\плюсам ФС
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Архитектура загрузки изображений

Сообщение ElisDN »

1. Одной общей папки avatars хватит. Но при желании можно разбивку на поддиректории сделать.
2. Подпапка у каждого пользователя + указание её корневой для файлменеджера WYSIWYG редактора.
Аватара пользователя
sapgv
Сообщения: 164
Зарегистрирован: 2013.05.27, 21:41

Re: Архитектура загрузки изображений

Сообщение sapgv »

а у php есть методы создание папок ?
например при регистрации пользователя создавать папку пользователя куда можно будет кидать все изображения
Аватара пользователя
sapgv
Сообщения: 164
Зарегистрирован: 2013.05.27, 21:41

Re: Архитектура загрузки изображений

Сообщение sapgv »

например будет ли правильно писать такой код при регистрации пользователя

Код: Выделить всё

<?php
public function makeDir(){
     mkdir("/path/to/my/dir", 0700);

}
?>
Евгений Владимирович
Сообщения: 64
Зарегистрирован: 2012.11.19, 08:42

Re: Архитектура загрузки изображений

Сообщение Евгений Владимирович »

sapgv писал(а):а у php есть методы создание папок ?
например при регистрации пользователя создавать папку пользователя куда можно будет кидать все изображения
http://php.net/manual/ru/function.mkdir.php
Евгений Владимирович
Сообщения: 64
Зарегистрирован: 2012.11.19, 08:42

Re: Архитектура загрузки изображений

Сообщение Евгений Владимирович »

sapgv писал(а):например будет ли правильно писать такой код при регистрации пользователя

Код: Выделить всё

<?php
public function makeDir(){
     mkdir("/path/to/my/dir", 0700);

}
?>
Может быть проблема, папка не будет создоваться из-за прав доступа
Аватара пользователя
TranceSmile
Сообщения: 562
Зарегистрирован: 2011.06.27, 19:04
Откуда: Украина
Контактная информация:

Re: Архитектура загрузки изображений

Сообщение TranceSmile »

желательно повторить основы php mkdir(). в моделей пользователей в событие afterSave() и создать папку для пользователя. Только один вопрос как вы будете бороться с одинаковыми файлами с разными именами?
Изображение
Аватара пользователя
sapgv
Сообщения: 164
Зарегистрирован: 2013.05.27, 21:41

Re: Архитектура загрузки изображений

Сообщение sapgv »

ок решил создавать для каждого пользователя свою папку
например user c id = 502 создам папку (502)
а в ней подпапки
-502
- avatar //буду тут хранить аватар пользователя
- profile //буду тут хранить остальные фотки пользователя
- posts //тут будут например статьи пользователя (внутри разобьем подпапки)
- 1 //папка для изображений 1 статью
- 2 //папка для изображений 2 статьи
- 3 //папка для изображений 3 статьи

вопрос может лучше объединить папки avatar и profile ?
также стоит ли разбивать папку posts ? или хранить изображений всех статей в папке posts ?
Аватара пользователя
sapgv
Сообщения: 164
Зарегистрирован: 2013.05.27, 21:41

Re: Архитектура загрузки изображений

Сообщение sapgv »

даа, вопрос имен файлов тоже открыт
Аватара пользователя
icewill
Сообщения: 46
Зарегистрирован: 2013.07.12, 06:45

Re: Архитектура загрузки изображений

Сообщение icewill »

Я не прибегал к подробной иеархии, делал как для фото галереи, создаем папку с случайно сгенерированным названием, потом в нее помещаем картинки допустим до 1000, затем создаем еще папку и ее наполняем картинками, как то так.
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: Архитектура загрузки изображений

Сообщение lancedevnull »

icewill писал(а):Я не прибегал к подробной иеархии, делал как для фото галереи, создаем папку с случайно сгенерированным названием, потом в нее помещаем картинки допустим до 1000, затем создаем еще папку и ее наполняем картинками, как то так.
и в поле image хранить еще имя папки? лишняя инфа, а при перемещении в другую папку так вообще %)
Аватара пользователя
sapgv
Сообщения: 164
Зарегистрирован: 2013.05.27, 21:41

Re: Архитектура загрузки изображений

Сообщение sapgv »

ну мне хотелось бы всегда знать где что лежит
а так получится что часть фоток в первой папке (с 1000 элементами) а оставшаяся часть в другой папке
надо будет делать таблицы связей куда записывать где что лежит
Аватара пользователя
icewill
Сообщения: 46
Зарегистрирован: 2013.07.12, 06:45

Re: Архитектура загрузки изображений

Сообщение icewill »

lancedevnull писал(а):
icewill писал(а):Я не прибегал к подробной иеархии, делал как для фото галереи, создаем папку с случайно сгенерированным названием, потом в нее помещаем картинки допустим до 1000, затем создаем еще папку и ее наполняем картинками, как то так.
и в поле image хранить еще имя папки? лишняя инфа, а при перемещении в другую папку так вообще %)
Пять символов погоды не сделают, а зачем что то перемещать? :?
_axl
Сообщения: 36
Зарегистрирован: 2011.10.01, 12:07

Re: Архитектура загрузки изображений

Сообщение _axl »

Если запись одна то ок, а если фоточек миллион? бессмысленно раздутая БД
Перемещать чтобы, например разделить нагрузку по нескольким сервакам
И еще, когда у вас несколько пользователей грузят фотки, каждый раз пересчитываются файлы в папке, зачем? И дисковые операции довольно медленные
Последний раз редактировалось _axl 2013.07.25, 10:26, всего редактировалось 1 раз.
Аватара пользователя
TranceSmile
Сообщения: 562
Зарегистрирован: 2011.06.27, 19:04
Откуда: Украина
Контактная информация:

Re: Архитектура загрузки изображений

Сообщение TranceSmile »

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

И при загрузке файла проверать хеш файла.
Изображение
Аватара пользователя
sapgv
Сообщения: 164
Зарегистрирован: 2013.05.27, 21:41

Re: Архитектура загрузки изображений

Сообщение sapgv »

я понимаю что единственного правильного решения быть не может
нужно выбрать оптимальное решение, потому что подразумевается что изображений пользователя будет немного,
но будет много его статей и в каждой статье будет до 6 изображений
Аватара пользователя
icewill
Сообщения: 46
Зарегистрирован: 2013.07.12, 06:45

Re: Архитектура загрузки изображений

Сообщение icewill »

Если длина 5 символов, то много папок вы не создадите.
Английский алфавит состоит из 26 символов, ну и длина 5. 26 возводим в 5 степень получается 11 881 376 возможных вариаций названий папок, куда больше?:)
Но если уж у вас очень глобальный проект можно еще в длину один символ добавить.
Аватара пользователя
ToxaDR
Сообщения: 87
Зарегистрирован: 2012.06.26, 23:03

Re: Архитектура загрузки изображений

Сообщение ToxaDR »

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

Чем плохи методы, описанные здесь ранее:
Для каждого пользователя своя папка
А что если будет 30 тыс пользователей, а если 500 тыс? К слову, в одной директории может быть максимум 65535 файлов, так что не вариант.
А еще больше половины из этих пользователей зарегистрируются один раз и уйдут навсегда, зачем тебе пустые папки?
Лишний код в контроллерах, моделях, везде. Гораздо удобнее сделать один единственный загрузчик изображений и хранить информацию об изображениях в одной таблице, а в других таблицах сделать поля типа avatar_id, image_id, profile_photo_id и т.д.
сделать таблицу с полями
тип рисунка - аватар, и т.д.
Лишняя таблица, которая вообще не нужна
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: Архитектура загрузки изображений

Сообщение S c »

мой способ - папка files/avatar + модель. Потом для каждой новой фотки создаю случайное имя папки (2 символа) и проверяю есть ли такая папка. Если есть - в существующую записываю, если нет - новую создаю. Для файла так же случайное имя генерирую. Ну и в таблицу, соответственно, указываю путь (начиная к примеру после папки 'files'). Потом когда нужно выдать thumb - захожу в папку где лежит полная фотография, проверяю есть ли там папка tmp (для превьюшек) и есть ли в этой папке что то типа 130x130_resizeType_filename.jpg и выдаю её, если нет - то создаю и выдаю.

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

Со статьями - подобная ситуация. files/post. Так же хранить, и отдельную таблицу, где id поста и пусть к изображению, для одной id много изображений.

И еще, удаление - в afterDelete добавляю функционал, который удаляет все фотографии с компьютера. Получаю basename фотографии, потом лезу в tmp и от туда убираю все, что имеет в названии "_basename".
Ответить