---
title: Завантаження файлів у task description
description: Фото і файли вантажаться в S3 через окремий ендпоінт; відео живе на Google Drive.
---

**Фото і файли** завантажуються в S3 через окремий ендпоінт і вставляються в текст
постійним публічним посиланням. **Відео не завантажується** — воно живе на Google
Drive, і Drive-посилання вставляється як звичайне посилання.

Налаштування доступу, ліміти ingress і життєвий цикл файлів — у
[інфраструктурній частині](/backend/uploads).

## Фото

`/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-посилання вставляється як звичайне посилання в текст.
