Файлы
Загрузка одним запросом и управление файлами бакета. Все методы требуют токен FULL.
Файл в ответе
Все методы, которые возвращают файл, отдают его в одном виде:
{
"id": "Xk3f9QaLm2Pw",
"name": "photo.webp",
"folder": "avatars",
"content": {
"size": 444,
"mime": "image/webp",
"extension": "webp",
"hash": "57faddf4ac10468a87ad4e986af5da30d519785f908184284526e3d9ccda3645"
},
"public": true,
"deduplicated": false,
"processed": { "applied": true, "operations": ["resize:300x200", "encode:webp@82"], … },
"expiresAt": null,
"privateUrl": "https://s5.example.com/p/Xk3f9QaLm2Pw",
"publicUrl": "https://s5.example.com/o/b554eae9-…/Xk3f9QaLm2Pw",
"createdAt": "2026-11-07T17:10:44+00:00",
"updatedAt": "2026-11-07T17:10:44+00:00"
}id— короткий идентификатор файла, он же часть адресов раздачи.content.hash— SHA-256 хранимого содержимого.deduplicated— только в ответе загрузки:true, если такое содержимое в бакете уже было и место на диске не потрачено. В остальных ответах всегдаfalse.processed— только в ответе загрузки: что сделала обработка картинки; без опций это{ "applied": false, "reason": "no options" }. В остальных ответах всегдаnull.publicUrl— есть только у публичного файла.expiresAt— когда файл удалится по сроку хранения папки;null— бессрочно.
POST /v1/files
Загружает файл одним запросом multipart/form-data. Для больших файлов используйте
загрузку частями.
Поля формы
| Поле | Тип | Описание |
|---|---|---|
file |
файл | Обязательно. Содержимое. |
folder |
строка | Имя папки. Без него — корень бакета. |
name |
строка | Имя файла. Без него — имя загруженного файла. |
format |
ORIGINAL · WEBP · JPEG · PNG · AVIF |
Перекодировать картинку. |
quality |
1–100 | Качество кодирования. |
maxWidth |
16–10000 | Уменьшить, если шире. |
maxHeight |
16–10000 | Уменьшить, если выше. |
curl -H "Authorization: Bearer <токен>" \
-F file=@photo.png -F folder=avatars -F format=WEBP -F maxWidth=300 \
http://<хост>:9090/v1/filesВозвращает 201 и файл.
Имя файла уникально в пределах папки (корень бакета — отдельное пространство имён): если
оно занято, к нему добавляется номер — photo (1).png. Имя очищается: /, \ и
управляющие символы заменяются на -.
Если при перекодировании меняется формат, меняется и расширение: photo.png → photo.webp.
GET /v1/files
Список файлов бакета, постранично.
| Параметр | По умолчанию | Описание |
|---|---|---|
page, limit |
1, 25 |
Страница и размер (до 100). |
search |
— | Поиск по имени, без учёта регистра. |
folder |
— | Имя папки. Пустая строка — только корень. Без параметра — все файлы. |
sort |
created |
created · name · type · size. |
dir |
desc |
asc · desc. |
GET /v1/files/{id}
Возвращает один файл.
PUT /v1/files/{id}
Переименовывает и/или переносит файл.
{ "name": "avatar.webp", "folder": "users" }name обязателен и очищается так же, как при загрузке: a/b.txt сохранится как
a-b.txt. Расширение при переименовании не подгоняется — каким задали, таким и будет.
Если имя в папке назначения занято — 409. folder — имя папки назначения; без него
файл попадает в корень.
При переносе файл получает видимость папки назначения, а также её срок хранения — срок считается от момента переноса.
Корень бакета всегда публичный
Перенос в корень делает файл публичным: у него появляется publicUrl, и он открывается
по /o/{bucketId}/{id} без токена. Приватный документ из приватной папки после такого
переноса станет доступен всем, у кого есть адрес. Держите приватные файлы в приватных папках.
DELETE /v1/files/{id}
Удаляет файл. Возвращает 204. Выданные на файл временные ссылки перестают работать.
Дедупликация
Одинаковое содержимое хранится в бакете один раз (по SHA-256). Копия стоит строку в базе, а не место на диске; удаление одной копии не трогает остальные.