03-12-2018 23:59

Предварительная загрузка файлов через сервис

POST   {BACKEND_UPLOAD_SERVICE_ADDRESS}/upload/

Общие сведения, концепт

Компоненты системы, развернутые извне доверенной инфраструктуры, не могут сохранять файлы непосредственно в файловое хранилище. 
Для этого они должны пользоваться специальным сервисом предварительной загрузки файлов.

Последовательность действий выглядит следующим образом:

  • компонент, находящийся вне доверенной инфраструктуры, запрашивает у ядра разрешение на предварительную загрузку файла;
    • разрешение запрашивается в условиях пользовательского контекста, то есть, с учетом имеющихся привилегий у текущего пользователя в текущей организации;
  • ядро проверяет полномочия текущего пользователя и при наличии достаточных привилегий выдает подписанный сертификат на предварительную загрузку файла;
  • компонент отправляет требуемый файл в сервис предварительной загрузки, предоставляя при этом дополнительно сертификат, полученный от ядра;
  • сервис предварительной загрузки проверяет предоставленный сертификат и при его валидности принимает отправленный файл и сохраняет его во временное пространство файлового хранилища;
  • успешно загруженный (и сохраненный во временное пространство файлового хранилища) файл может затем использоваться в дальнейших бизнес-операциях (например, может быть привязан к клиенту);

Описанный сценарий обычно используется при первичной загрузке файлов со стороны конечных пользователей (фотографии клиентов, документы для оформления займов и проч.).

API

Сертификат и файл отправляются в сервис предварительной загрузки как данные формы. Соответственно, в заголовке запроса для типа содержимого должно быть указано значение multipart/form-data.

Сигнатура:

    POST {BACKEND_UPLOAD_SERVICE_ADDRESS}/upload/

 

Заголовки:

    content-type:multipart/form-data; boundary={BOUNDARY}

 

Часть 1 (заголовки + тело):

    Content-Disposition: form-data; name="certificate" 

    {CERTIFICATE}

 

Часть 2 (заголовки + тело):

    Content-Disposition: form-data; name="files"; filename="{FILE_NAME}" 
    Content-Type: {FILE_CONTENT_TYPE}

    {FILE_CONTENTS}
 

Часть 3 (заголовки + тело):

Content-Disposition: form-data; name="data[spaceCode]"
{SPACE_CODE}

Content-Disposition: form-data; name="data[category]"
{CATEGORY}
 

Часть 4 (заголовки + тело) (опциональные, обязательность зависит от spaceCode и category):

Content-Disposition: form-data; name="data[clientId]"
{CLIENT_ID}
 

Отдельные параметры, используемые в запросе:

  • 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"
	}

                    
У данной функции отсутствует описание параметров ответа