Загрузка пользователем файлов для разных систем. Скриншоты и связанные файлы к задачам и документам, аватарки, иконки справочников и проектов.
Загрузка пользователем файлов для разных систем. Скриншоты и связанные файлы к задачам и документам, аватарки, иконки справочников и проектов.
var/filesln -s var/files public/files<hash>_thumb<thumb_id>.jpg. С другой стороны чтобы их не копилось слишком много в одной директории все же стоит делать какое-то разбиение. Стоит делать как-той быстрый хеш файла или даже названия и его начало превращать в директории.user/avatar - аватарки пользователей - удобно, но тут надо помнить все деленияp/<suffix> (project_<suffix>, project/<suffix>)avatars - аватарки юзеровtask_attachments - связанные с задачей файлыtask_images - связанные с задачей изображения (изображения можно добавить и как файл, но тогда она будет вставляться в <a>, если же добавить как картинку, будут созданы сабнеилы и в описание её можно будет вставить и вставленное превратиться в <img>images - знает о том, что надо выводить в виде картинок и нарезать на сабнейлыfiles - общий тип который мы ниак не обрабатываем, просто даем скачиватьdwg - когда-нибудь, когда будет свой плагин рисования схем прямо на странице проекта, и отображения их как схем.txt - все текстовые файлы, включая txt, log, json, php, css, html, cpp и т.д., файлы которые мы не обрабатываем, но можем показать как текст прямо в проекте, вохможно даже сделав подсветку кода.Итого:
var/files/p/<project>/<file_type>/<??>/<filename>.<ext>
var/files/p/tndt/file/d3/shema_dannih.dwgvar/files/p/sg/file/57/example_export.xlsvar/files/p/<project>/<file_type>/<??>/<filename>_<thumb>.<ext>
var/files/p/tndt/image/2f/v2_screenshot_intext.pngvar/files/p/tndt/image/2f/v2_screenshot_inpage.pngvar/files/p/tndt/image/2f/v2_screenshot_full.pngvar/files/u/<userLogin>/<file_type>/<??>/<filename>.<ext>
var/files/u/demius/image/23/avatar.pngvar/files/u/demius/image/2b/badges.pngAttachmentsService может добавить файл (через UploadService загружает его и сохраняет инфу о нем в БД), применить при к нему необходимую нормализацию. По указанной информации дать прямую ссылку на оригинал или thumb. По указанной сущности может выдать список файлов. UploadService загружает файл в указанную директорию, удаляет его, в будущем переименовывает или заменяет. ThumbnailService делает необходимые сабнеилы. Используется AttachmentsService для формирования ссылки на thumbnail
Enum с типами загрузок. Каждый тип определяет какие файлы можно в него грузить, в есть ли у него сабнеилы и их набор. Так же тип определяет по какому пути файлы лежат, связаны ли они с конкретным проектом.
Информацию о файле храним в БД.
Сущность File
id - можно и uuid, списком по этому полю их не будут выводить, можно и забить обычный big int, много их все равноне будет.type - FileTypeEnum то как мы обрабатываем файл. По умолчанию file (никак, только храним и даем загрузить). В tndt-198 появится тип image, умеющий отображать их на страницах, делать сабнейлы и т.д.mime - определнный mime-тип содержимого. от него может зависеть иконка, добавляться определяться подсветка синтаксиса, и что-то еще. Кроме того его можно указать в ответе помогая браузеру его отобразить.subType - в зависимости от type это возможно не нужен, и решается через mime
null - для type==file?? - для type==image (avatar, attachment, project_icon, …) по нему ImageService понимает какие сабнейлы делать, и гдеони лежат?? - для type==txt (txt,php,cpp,go) для подсветки синтаксисаname - имя файла транслитерация caption на английский и с экранированием всех необычных символов. Это то, под каким названием файл скачается. От него же берется хеш и первые два символа будут поддиректорией, чтобы не оказывалось слишком много файлов в одной директории. Наверное после загрузки его можно отредактировать, тогда будет обновлена и запись в БД, и реальное имя файла. Когда файл к чему-то прикреплен переименовывать его не очень удобно, но на следующей итерации можно добавить такой механизм.caption|label - русское название файла, как введет польователь, для отображения в блоках.Сущность Attachment Для файлов крепящихся к задачам и документам. Общее пространство внутри проекта.
attachment_identity_identity_typeАватарки крепятся напрямую реляцией User.avatarId == File.Id
Публичные и приватные файлы лежат в хранилище в разных директориях.
Итак, базовая tndt-77 уже работает, остается доделать удаление, так что пора актуализировать документ.