- Создал(а) Неизвестный пользователь (a.g.komarov@rt-sk.ru) мая 22, 2025

GIT - https://git.gosuslugi.local/ervu/source/s3-proxy/

## Требование

https://jira.egovdev.ru/browse/ERVU-8660

## Описание

Задача - https://jira.egovdev.ru/browse/ERVU-8660

Требование: уйти от прямых ссылок на скачивание \ предпросмотр файлов, перевести работу фронта с s3-хранилищем на прокси-сервис (этот), доступ к которому скрыт за proxy-gateway.

Сервис для работы фронта с s3, предоставляет эндпоинты для скачивания, загрузки, архивации и извлечения файлов. В контуре, как и остальные сервисы фронта, сервис скрыт за proxy-gateway.

## REST

### |GET| ./download/v1

Выгрузка файла из s3 хранилища, вернёт стрим файла

#### Строковые параметры (query string) запроса

- s3Link - s3 url encoded или decoded ссылка на файл
- fileName - Оригинальное имя файла (для хедера Content-Disposition: attachment; filename = ...) Если параметр присутствует, то файл сохранится под этим именем, если отсутствует, то пробуем найти это имя в юзер-метадате запрашиваемого файла под ключом 'name' (логика mz-adapter), если и там не нашли, то вернётся текущее имя файла из хранилища

#### Тело ответа: содержимое файла.

#### Хедеры ответа:

content-type - binary/octet-stream
content-disposition - имя файла по спецификации RFC 6266

#### Пример запроса

./s3-proxy/download/v1?s3Link=s3://bucket/actualName.zip&fileName=rightName.zip

#### Пример curl

?

`curl --request GET \` `` `--url` `'http://localhost:8080/download/v1?s3Link=s3%3A%2F%2Fbucket%2Ffilename.zip&fileName=rightName.zip'` `\` `` `--header` `'Authorization: Bearer TOKEN'`

### |PUT| ./upload/v1

Загружает файл в s3 хранилище, добавляет суффикс к имени файла, чтобы поддержать уникальные имена в хранилище, возвращает s3 ссылку, вида s3://bucket/objectKey-{suffix}.{extension}, пример - s3://printer/filename-0123456789.zip

#### Строковые параметры запроса

- objectKey - ключ объекта для сохранения, может быть пустой, в этом случае будет использовано имя загружаемого файла, может быть составной ключ, вида "2025/05/01/filename.txt", тогда в хранилище будет создана соответствующая структура "папок" и итоговая ссылка будет вида s3://bucket/2025/05/01/filename-{suffix}.txt
- bucket - бакет для сохранения файла, может быть пустой, в этом случае будет использован дефолтный

#### Тело запроса

- file - multipart/form-data контент файла

#### Тело ответа

- s3Link - ссылка на файл в s3 хранилище

#### Пример запроса

./s3-proxy/upload/v1?objectKey=testfile321.zip&bucket=proxy

#### Пример ответа

response_200 Развернуть исходный код
expand source?

1 2 3 | `{` `` `"s3Link"``:` `"s3://proxy/testfile321--5900790575884493103.zip"` `}`

#### Пример curl

?

`curl --request PUT \` `` `--url` `'http://localhost:8080/upload/v1?objectKey=filename.zip&bucket=bucket'` `\` `` `--header` `'Authorization: Bearer TOKEN'` `\` `` `--header` `'content-type: multipart/form-data'` `\` `` `--form` `'file=@C:\Users\AdminLocal\Desktop\example.xml'`

### |POST| ./archive/v1

Синхронно создает zip-архив из объектов с указанными URL и отдает клиенту ответ с ссылкой в s3 на архив, также отправляет ответ в топик s3proxy.archive

#### Тело запроса

- objectUrls - массив s3 ссылок на файлы для архивации
- resultArchiveObjectKey - имя файла для итогового архива, если такой файл уже существует в хранилище - вернётся ошибка

#### Тело ответа

- success - флаг успешности операции
- s3Url - s3 ссылка на итоговый архив
- dateTime - время окончания операции

#### Пример запроса

./s3-proxy/archive/v1

request Развернуть исходный код
expand source?

1 2 3 4 5
6
7
`{`
`` `"objectUrls"``: [`
`` `"s3://bucket/file1.zip"``,`
`` `"s3://bucket/file2.zip"`
`` `],`
`` `"resultArchiveObjectKey"``:``"resultArchive.zip"`
`}`

#### Пример ответа

response_200 Развернуть исходный код
expand source?

1 2 3 4 5 | `{` `` `"success"``:` `true``,` `` `"s3Url"``:` `"s3://bucket/resultArchive.zip"``,` `` `"dateTime"``:` `"2025-05-22T14:40:27.288401100Z"` `}`

#### Пример curl

?

`curl --request POST \` `` `--url http:``//localhost:8080/archive/v1 \` `` `--header` `'Authorization: Bearer TOKEN'` `\` `` `--header` `'content-type: application/json'` `\` `` `--data '{`
`` `"objectUrls"``: [`
`` `"s3://bucket/file1.zip"``,`
`` `"s3://bucket/file2.zip"`
`` `],`
`` `"resultArchiveObjectKey"``:``"resultArchive.zip"`
`}'`

### |POST| ./archive-async/v1

Асинхронно создает zip-архив из объектов с указанными URL, отправляет ответ в топик s3proxy.archive

#### Тело запроса

- objectUrls - массив s3 ссылок на файлы для архивации
- resultArchiveObjectKey - имя файла для итогового архива, если такой файл уже существует в хранилище - вернётся ошибка

#### Тело ответа контроллера

- success - флаг успешности операции

#### Тело ответа сообщения в кафку

- success - флаг успешности операции
- s3Url - s3 ссылка на итоговый архив
- dateTime - время окончания операции

#### Пример запроса

./s3-proxy/archive-async/v1

request Развернуть исходный код
expand source?

1 2 3 4 5
6
7
`{`
`` `"objectUrls"``: [`
`` `"s3://bucket/file1.zip"``,`
`` `"s3://bucket/file2.zip"`
`` `],`
`` `"resultArchiveObjectKey"``:``"resultArchive.zip"`
`}`

#### Пример ответа контроллера

response_200 Развернуть исходный код
expand source?

1 2 3 | `{` `` `"success"``:` `true` `}`

#### Пример ответа в кафку

response_200 Развернуть исходный код
expand source?

1 2 3 4 5 | `{` `` `"success"``:` `true``,` `` `"s3Url"``:` `"s3://bucket/resultArchive.zip"``,` `` `"dateTime"``:` `"2025-05-22T14:40:27.288401100Z"` `}`

#### Пример curl

?

`curl --request POST \` `` `--url http:``//localhost:8080/archive-async/v1 \` `` `--header` `'Authorization: Bearer TOKEN'` `\` `` `--header` `'content-type: application/json'` `\` `` `--data '{`
`` `"objectUrls"``: [`
`` `"s3://bucket/file1.zip"``,`
`` `"s3://bucket/file2.zip"`
`` `],`
`` `"resultArchiveObjectKey"``:``"resultArchive.zip"`
`}'`

### |POST| ./archive-download/v1

Создает zip-архив из объектов с указанными URL и отдает клиенту, вернёт стрим файла

#### Тело запроса

- objectUrls - массив s3 ссылок на файлы для архивации

#### Тело ответа: содержимое файла (созданный архив).

#### Хедеры ответа:

content-type - binary/octet-stream
content-disposition - имя файла по спецификации RFC 6266

#### Пример запроса

./s3-proxy/archive-download/v1

request Развернуть исходный код
expand source?

1 2 3 4 5
6
`{`
`` `"objectUrls"``: [`
`` `"s3://bucket/file1.zip"``,`
`` `"s3://bucket/file2.zip"`
`` `]`
`}`

#### Пример curl

?

`curl --request POST \` `` `--url http:``//localhost:8080/archive-download/v1 \` `` `--header` `'Authorization: Bearer TOKEN'` `\` `` `--header` `'content-type: application/json'` `\` `` `--data '{`
`` `"objectUrls"``: [`
`` `"s3://bucket/file1.zip"``,`
`` `"s3://bucket/file2.zip"`
`` `]`
`}'`

### |GET| ./extract/v1

Выгружает архив из s3 хранилища, распаковывает, определяет и отдаёт нужный файл, вернёт стрим файла

#### Строковые параметры (query string) запроса

- s3Link - s3 url encoded или decoded ссылка на файл
- type - указатель на тип файла, enum {file / sign}, file - для получения основного файла (.pdf), sign - для получения файла подписи (.sig)

#### Тело ответа: содержимое распакованного файла.

#### Хедеры ответа:

content-type - binary/octet-stream
content-disposition - имя файла по спецификации RFC 6266

#### Пример запроса

./s3-proxy/extract/v1?s3Link=s3://bucket/filename.zip&type=sign

#### Пример curl

?

`curl --request GET \` `` `--url` `'http://localhost:8080/extract/v1?s3Link=s3%3A%2F%2Fbucket%2Ffilename.zip&type=sign'` `\` `` `--header` `'Authorization: Bearer TOKEN'`

Нравится Станьте первыми кому понравится это

- Нет меток
- Редактировать метки

Написать комментарий...

Добавить комментарий

Обзор
Инструменты контента
{"serverDuration": 98, "requestCorrelationId": "4b000cf926d19ac2"}
search
recentlyviewed
attachments
weblink
advanced
image-effects
image-attributes

- Абзац

- Жирный
- Курсив
- Подчеркнутый
- Cредство выбора цвета
  Дополнительные цвета
- Форматирование

- Маркированный список
- Нумерованный список

- Список задач

- Убрать отступ
- Сделать отступ

- Выровнить по левому краю
- Выровнить по центру
- Выровнить по правому краю

- Разметка страницы

- Ссылка

- Таблица

- Вставить

- Разметка страницы

- Отменить
- Восстановить

- Найти/Заменить

- Справка по быстрым ссылкам на клавиатуре

Подключение...