Завантаження файлів у task description
Фото і файли вантажаться в S3 через окремий ендпоінт; відео живе на Google Drive.
Фото і файли завантажуються в S3 через окремий ендпоінт і вставляються в текст постійним публічним посиланням. Відео не завантажується — воно живе на Google Drive, і Drive-посилання вставляється як звичайне посилання.
Налаштування доступу, ліміти ingress і життєвий цикл файлів — у інфраструктурній частині.
Фото
/image у слеш-меню → файловий пікер → S3. У документі лишається
https://assets.kumquat.myplantin.com/uploads/<sha256>/<ім'я> — постійне, працює в інкогніто,
переживає перезавантаження.
- Типи: PNG, JPEG, WebP, GIF. Ліміт 10 МБ.
- Тип визначається по вмісту файлу, не по розширенню й не по заголовку від клієнта.
- Pillow перевіряє, що файл справді декодується, і дає розміри — редактор резервує під них місце, тому лейаут не стрибає.
- Ключ містить sha256, тому повторне завантаження того самого файлу не створює дубль.
Файли
/file → будь-який тип, ліміт 25 МБ. PDF відкривається інлайново, все інше скачується.
Тип не обмежується списком: замість заборон обʼєкти віддаються з
Content-Disposition: attachment. Бакет публічний, і це принципово — файл, який завантажується
замість того, щоб рендеритись, не може виконатись на нашому домені. Тому html чи svg приймаються
і при цьому нешкідливі.
Відео
Не завантажується на наш S3 — воно живе на Google Drive (для відео вже є gdrive-sync пайплайн, а 45-мегабайтні файли не пройшли б через ingress).
Блок Video в редакторі є, але для Drive він не працює: BlockNote рендерить його як
<video src="...">, тобто чекає пряме посилання на медіафайл. Посилання на файл у
Drive — це сторінка перегляду, а не медіафайл, тому такий блок лишиться порожнім.
Тому Drive-посилання вставляється як звичайне посилання в текст.