Skip to main content
Когда нужно прикрепить к объекту большой файл, передавать его через сервер приложения неэффективно и ненадёжно. Для таких случаев предусмотрена прямая загрузка в облачное хранилище: сам файл минует сервер приложения и уходит напрямую в хранилище одним запросом, а сервер лишь координирует процесс — выдаёт временную ссылку в начале и закрепляет уже загруженный файл записью-вложением в конце. Результатом успешной загрузки становится обычный прикреплённый файл.
Файл не проходит через сервер приложения. Клиент отправляет его напрямую в хранилище по временной ссылке одним запросом — без разбиения на части. Это снимает нагрузку с сервера и позволяет загружать файлы, размер которых значительно превышает обычные лимиты запроса.

Логика

Весь процесс доступен только авторизованным пользователям и состоит из двух шагов. Шаг 1. Инициализация. Клиент передаёт имя файла. Система извлекает расширение из имени (в нижнем регистре), формирует уникальный ключ хранения в папке для файлов, где имя заменяется на случайный идентификатор с сохранением расширения (так исходное имя в хранилище не фигурирует и коллизии имён исключены), и выдаёт временную ссылку на прямую загрузку файла в хранилище. В ответ клиент получает саму ссылку и ключ хранения.
Ссылка сознательно не подписывается на конкретный тип содержимого — так подписанным заголовком остаётся только адрес хранилища. Это позволяет клиенту не выставлять собственный заголовок типа содержимого, а значит не требует отдельной настройки разрешённых заголовков CORS на стороне хранилища.
Временная ссылка на загрузку действует 1 час. Если загрузка не успевает начаться за это время, ссылку нужно запросить заново.
Шаг 2. Завершение и создание вложения. После успешной загрузки клиент вызывает завершение и передаёт: По имени типа объекта определяется вид родительского объекта, а расширение вычисляется из ключа хранения (если определить не удалось — применяется значение по умолчанию для двоичных данных). Затем создаётся запись-вложение: компания и автор берутся из контекста запроса, категория и название — из запроса (если указаны), а привязка к объекту — из переданных типа и идентификатора объекта. Ссылка на сам файл устанавливается на уже загруженный объект хранилища по его ключу — файл повторно не загружается.
На шаге завершения новый файл не передаётся — запись-вложение лишь «закрепляется» за уже загруженным в хранилище файлом. Вложение в системе появляется только после успешного завершения.

Особенности поведения

Прочие особенности:
  • Определение вида родительского объекта идёт только по имени вида без учёта приложения — при совпадении имён в разных приложениях поиск завершится ошибкой из-за неоднозначности.
  • Обязательные поля берутся напрямую, без предварительной проверки — отсутствие имени файла или ключа хранения приведёт к внутренней ошибке вместо аккуратного ответа о некорректном запросе.
  • Расширение вычисляется из ключа хранения (то есть из исходного имени файла на шаге инициализации), а не из типа содержимого; при отсутствии расширения подставляется значение по умолчанию для двоичных данных.