Предварительная загрузка файлов через сервис
POST   {BACKEND_UPLOAD_SERVICE_ADDRESS}/upload/
Общие сведения, концепт
Компоненты системы, развернутые извне доверенной инфраструктуры, не могут сохранять файлы непосредственно в файловое хранилище.
Для этого они должны пользоваться специальным сервисом предварительной загрузки файлов.
Последовательность действий выглядит следующим образом:
-
компонент, находящийся вне доверенной инфраструктуры, запрашивает у ядра разрешение на предварительную загрузку файла;
- разрешение запрашивается в условиях пользовательского контекста, то есть, с учетом имеющихся привилегий у текущего пользователя в текущей организации;
- ядро проверяет полномочия текущего пользователя и при наличии достаточных привилегий выдает подписанный сертификат на предварительную загрузку файла;
- компонент отправляет требуемый файл в сервис предварительной загрузки, предоставляя при этом дополнительно сертификат, полученный от ядра;
- сервис предварительной загрузки проверяет предоставленный сертификат и при его валидности принимает отправленный файл и сохраняет его во временное пространство файлового хранилища;
- успешно загруженный (и сохраненный во временное пространство файлового хранилища) файл может затем использоваться в дальнейших бизнес-операциях (например, может быть привязан к клиенту);
Описанный сценарий обычно используется при первичной загрузке файлов со стороны конечных пользователей (фотографии клиентов, документы для оформления займов и проч.).
API
Сертификат и файл отправляются в сервис предварительной загрузки как данные формы. Соответственно, в заголовке запроса для типа содержимого должно быть указано значение multipart/form-data.
Сигнатура:
Заголовки:
Часть 1 (заголовки + тело):
Часть 2 (заголовки + тело):
Часть 3 (заголовки + тело):
Часть 4 (заголовки + тело) (опциональные, обязательность зависит от spaceCode и category):
Отдельные параметры, используемые в запросе:
-
BACKEND_UPLOAD_SERVICE_ADDRESS - адрес развернутого сервиса предварительной загрузки; включает в себя:
- протокол;
- имя/домен/адрес хоста;
- порт, на котором висит сервис;
- путь до обработчика;
-
BOUNDARY - разделитель разных частей запроса;
требование спецификации http-протокола для запросов из многих частей (multipart/form-data); - CERTIFICATE - сертификат, полученный от ядра, как есть;
- FILE_NAME - имя загружаемого файла;
- FILE_CONTENT_TYPE - типа содержимого файла (MIME type - application/octet-stream, image/png итп);
- FILE_CONTENTS - содержимое загружаемого файла;
- SPACE_CODE и CATEGORY - раздел и категория файлов указанные при получении сертификата. Исходя из комбинации этих параметров применяются различные стратегии обработки файлов. Список разделов и категорий
- CLIENT_ID - ид клиента, используется для привязки файлов к клиенту. Необходим при использовании spaceCode: 'client'
Ошибки загрузки:
- BAD_CERTIFICATE - невалидный сертификат;
- FILENAME_CONFLICT - файл с таким именем уже существует;
- UNHANDLED_EXCEPTION - непредвиденная ошибка, - нераспознанное, но перехваченное исключение;
Адреса серверов (BACKEND_UPLOAD_SERVICE_ADDRESS):
- https://upload.brainysoft.ru/
- https://upload-test.brainysoft.ru/
Запрос
POST https://upload.brainysoft.ru/upload/
content-length:177162
content-type:multipart/form-data; boundary=----WebKitFormBoundaryns2IsJViClB8UOkM
------WebKitFormBoundaryns2IsJViClB8UOkM
Content-Disposition: form-data; name="certificate"
{
"user":"01",
"customer":"cust-generic",
"userAddress":"",
"location":"upload/client/custom/cust-generic",
"noise":"D05E8AE2FAE14597A2F5B148C042FC25",
"validUptoTimestamp":"1463502944",
"modifiers":"-noip-",
"signature":"ch6O0nJC9K6-dr2alyDb2w",
"extraData":null,
"clientId":101327
}
------WebKitFormBoundaryns2IsJViClB8UOkM
Content-Disposition: form-data; name="files"; filename="may-16-lets-start-fresh-cal-2560x1440.png"
Content-Type: image/png
...
------WebKitFormBoundaryns2IsJViClB8UOkM--
Нет описанных параметров
Ответ
Успех:
{
"status":"ok",
"data":
{
"filename":"101327.may-16-lets-start-fresh-cal-2560x1440.png"
}
}
Неудача:
{
"status":"error",
"code":"FILENAME_CONFLICT"
}