Во многих современных веб-приложениях большую часть входящих данных составляют файлы. Декларативный фреймворк Evado организует работу с пользовательскими файлами в несколько уровней.
Первый уровень - это компонент приложения, который обеспечивает функционал взаимодействия с файловым хранилищем. По умолчанию таким хранилищем является файловая система.
Второй уровень - это модель, хранящая запись о файле загруженном пользователем. Эта модель не связана с метаданными приложения. Она необходима для асинхронной загрузки файла, до сохранения самого объекта.
Третий уровень - это класс метаданных с файловым поведением, которое связывает его с определенным хранилищем и содержит ограничивающие параметры (например, размер, тип файла и т.п.).
Таким образом процесс обработки файла происходит следующим образом. Пользователь открывает форму создания объекта класса, реализующего файлового поведение, и через представление файлового атрибута загружает файл на сервер, где он проверяется и сохраняется. На форму возвращается идентификатор файла в хранилище. Затем пользователь сохраняет форму. На сервере создается новый объект класса, который хранит идентификатор файла, и который назначается как владелец загруженного файла.
Владельцы
Из-за асинхронной загрузки файлов может получиться так, что файл загружен, а объект, который его содержит не сохранен. Такие файлы можно увидеть в модуле «Администрирование» - у них отсутствует значение «Владелец».
При отсутствующем владельце не забудьте проверить время загрузки файла. Может быть пользователь ещё не успел нажать кнопку «Сохранить» на форме объекта.
Для удаления ничейных файлов настроена задача deleteExpiredFiles, которая периодически выполняет работу по выборке и удалению файлов, у которых после загрузки прошло больше заданного времени и отсутствует владелец.
Удалить файлы, у которых есть владелец, напрямую нельзя. Сначала удалите владельца, а файл, который к нему привязан, удалится автоматически.
Доступы
Загрузка файлов в приложение ограничена разрешением moduleApiBaseUpload. Если оно отсутствует у роли, назначенной пользователю, то загрузка запрещена.
Доступ на скачивание определяется разрешением на чтение объектов класса c файловым поведением. Подробнее о ролевой системе безопасности фреймворка Evado смотрите в статье «Права доступа для метаданных».
Изображения
Для файлов изображений могут быть созданы миниатюры определенного размера и формата. Это уменьшает нагрузку при передачи данных в различных ситуациях.
Создание миниатюр зависит от хранилища. На данный момент оно реализовано для локального хранилища.
Параметры миниатюр передаются через компонент файлового хранилища. По умолчанию определены четыре размера (кодовое имя - максимальный размер по ширине и высоте):
- xs - 64 пикселя;
- sm - 256 пикселя;
- md - 512 пикселя;
- lg - 1024 пикселя.
Миниатюры создаются в момент запроса пользователя и кэшируются в указанной папке (upload/thumbnail). Они относятся к служебным данным и не должны попадать в систему контроля версий. В случае изменения параметров миниатюр, сгенерированные изображения можно удалить. Вместо них будут созданы новые.
Рабочий пример с использование миниатюр, а также наложения водяного знака, можно найти в веб-приложении «Блог».
Облака
Фреймворк Evado поддерживает работу с облачными хранилищами. Функционал взаимодействия реализован в компоненте s3Storage с помощью библиотеки minio.
Чтобы подключить S3 хранилище к метаданным, добавьте классу поведение «Облачное хранилище». Пример можно найти в демо-приложении. Для запуска S3 сервиса используйте команду docker run -p 9000:9000 -p 9001:9001 minio/minio server /miniodata --console-address ":9001". Войдите в консоль хранилища localhost:9001 и создайте demo bucket.
Взаимодействие пользователей с облачными файлами имеет несколько отличий от тех, что хранятся в файловой системе. Пользователь сначала получает ссылку на S3 сервис, а затем загружает туда файл. Также и при скачивании - сначала происходит получение ссылки от сервиса. Ссылки имеют ограниченное время жизни, которое настраивается в параметрах компонента хранилища.
Заключение
Внедрение системного функционала, такого как загрузка файлов, в метаданные, позволяет легко связывать его с сущностями вашего приложения. А модульная структура фреймворка Evado упрощает добавление и замену любой части файлового функционала для расширения текущих хранилищ или подключения новых.
Ссылки на готовые приложения и работающий онлайн пример представлены на сайте фреймворка Evado.