Вложенный файл, тип свойства 'list of attachments' (на примере класса 'abc/mnesia' и свойства 'patts')

Обзор

Позволяет приложить к сущности произвольное количество файлов-вложений с размещением на диске в преднастроенном хранилище, связанным с коллекцией класса.
И в дальнейшем производить операции чтения, замены, удаления вложения.

Каждое свойство типа `list of attachments` формирует в REST-API отдельный endpoint этого типа. Это поле типа `attachment` с установленным признаком `multi`=`true`.

Файл после загрузки методом POST сохраняет имя и расширение, а при загрузке методом PUT приобретает имя и расширение идентичное указанному идентификатору вложения.

Допустимо закачивать одним POST-запросом сразу нескольких файлов в режиме `multipart/form-data`.

Реальный путь к вложениям формируется одинаково вне зависимости от типа хранилища:
* Для категорий - `…​/Domain/ClassName/Id12/Id34/Id56/IdRest/PropertyName/FileName`
* Для истории - `…​/Domain/ClassName/PartitionFieldDate/Id12/Id34/Id56/IdRest/PropertyName/FileName`

Запросы

HTTP verb Endpoint Описание

GET

/rest/v1/model/model/<classname>/<id>/<attachment_property>

Получения метаданных по всем файлам вложений, связанных со свойством

GET

/rest/v1/model/model/<classname>/<id>/<attachment_property>/<file>

Скачивание конкретного файла вложения

PUT

/rest/v1/model/<classname>/<id>/<attachment_property>/<file>

Заливка файла вложения

DELETE

/rest/v1/model/<classname>/<id>/<attachment_property>/<file>

Удаление файла вложения


Заливка файлов вложений с сохранением имен

Загрузка в коллекцию производится с помощью Content-Type: multipart/formdata.

В запросе может быть один или несколько файлов. Файлы размещаются под именами, указанными в заголовках Content-Disposition каждой части.

Если файл с указанным именем уже существует, то он не сохраняется и возвращает ошибку. В зависимости от Content-Type и наличия успешно размещенных файлов в запросе может быть возвращен неудачный HTTP-ответ, либо информация о неудаче в теле HTTP-ответа 200 OK.

Запрос

Пример запроса
POST /rest/v1/model/abc/mnesia/6f7d27df-017b-ab81-77e7-7cd30a921f58/patts HTTP/1.1
Content-Type: multipart/form-data; boundary=-----------boundary_69df8120352a996e

-----------boundary_69df8120352a996e
Content-Type: application/octet-stream
Content-Disposition: form-data; name="filename"; filename="app.mp3"
Content-Transfer-Encoding: binary

BINARY BODY OF 'app.mp3'
-----------boundary_69df8120352a996e--

Ответ

Пример ответа
[
  {
    "name": "F.zip",
    "size": 8411,
    "last_modified": "2019-09-20 10:45:41"
  },
  {
    "name": "Package.bin",
    "size": 12268,
    "last_modified": "2019-09-20 10:45:49"
  }
]

Получения метаданных по всем файлам вложений, связанных со свойством

Запрос

Пример запроса
GET /rest/v1/model/abc/mnesia/6f7d27df-017b-ab81-77e7-7cd30a921f58/patts HTTP/1.1

Ответ

Пример ответа
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

[
  {
    "name": "F.zip",
    "size": 8411,
    "last_modified": "2019-09-20 10:45:41"
  },
  {
    "name": "Package.bin",
    "size": 12268,
    "last_modified": "2019-09-20 10:45:49"
  }
]

Скачивание конкретного файла вложения

Запрос

Table 1. Параметры запроса
Имя Тип Описание

attachment

bool

Тип выдачи. По умолчанию false.

true – выдаётся с заголовком Content-Disposition: attachment; filename=filename.ext либо Content-Disposition: attachment; filename*=UTF-8''%d1%84%d0%b0%d0%b9%d0%bb.ext, где файл.ext – имя файла в кодировке UTF-8 и URLencoded.

false – выдается без заголовка Content-Disposition.

Пример запроса
GET /rest/v1/model/abc/mnesia/6f7d27df-017b-ab81-77e7-7cd30a921f58/patts/app.mp3 HTTP/1.1

Ответ

Пример ответа
HTTP/1.1 200 OK
Content-Type: application/octet-stream; charset=utf-8
Content-Disposition: attachment; filename*=UTF-8''Some%20file.mp3

BINARY BODY OF 'Some file.mp3'

Заливка файла вложения

Производит замену файла.

Загрузка одного файла производится либо с помощью Content-Type: multipart/formdata, либо с произвольным Content-Type не являющимся мультипартом.

Если загрузка происходит с Content-Type: multipart/formdata, то будет сохранён только первый файл (первая часть имеющая поле filename в заголовке Content-Disposition), а само название файла будет проигнорировано.

Запрос

Пример запроса (octet-stream)
PUT /rest/v1/model/abc/mnesia/6f7d27df-017b-ab81-77e7-7cd30a921f58/patts/app.mp3 HTTP/1.1
Content-Type: application/octet-stream

BINARY BODY OF 'app.mp3'
Пример запроса (multipart)
PUT /rest/v1/model/abc/mnesia/6f7d27df-017b-ab81-77e7-7cd30a921f58/patts/app.mp3 HTTP/1.1
Content-Type: multipart/form-data; boundary=-----------boundary_69df8120352a996e

-----------boundary_69df8120352a996e
Content-Type: application/octet-stream
Content-Disposition: form-data; name="abcde"; filename="app.mp3"
Content-Transfer-Encoding: binary

BINARY BODY OF 'app.mp3'
-----------boundary_69df8120352a996e--

Ответ

Пример ответа
HTTP/1.1 204 No Content

Удаление файла вложения

Запрос

Пример запроса
DELETE /rest/v1/model/abc/mnesia/6f7d27df-017b-ab81-77e7-7cd30a921f58/patts/app.mp3 HTTP/1.1

Ответ

Пример ответа
HTTP/1.1 204 No Content