Облачное хранилище

Доступ к S3-совместимому объектному хранилищу. Загрузка, скачивание, перечисление и управление файлами с поддержкой presigned URL.

Настройку хранилища см. в Cloud Storage.

Загрузка

local cloudstorage = require("cloudstorage")

Получение хранилища

Получить ресурс облачного хранилища по ID реестра:

local storage, err = cloudstorage.get("app.infra:files")
if err then
    return nil, err
end

storage:upload_object("data/file.txt", "content")
storage:release()
Параметр Тип Описание
id string ID ресурса хранилища

Возвращает: Storage, error

Загрузка объектов

Загрузка содержимого из строки или файла:

local storage = cloudstorage.get("app.infra:files")

-- Загрузка строкового содержимого
local ok, err = storage:upload_object("reports/daily.json", json.encode({
    date = "2024-01-15",
    total = 1234
}))

-- Загрузка из файла
local fs = require("fs")
local vol = fs.get("app:data")
local file = vol:open("/large-file.bin", "r")

storage:upload_object("backups/large-file.bin", file)
file:close()

storage:release()
Параметр Тип Описание
key string Ключ/путь объекта
content string или Reader Содержимое как строка или файловый reader

Возвращает: boolean, error

Скачивание объектов

Скачать объект в файловый writer:

local storage = cloudstorage.get("app.infra:files")
local fs = require("fs")
local vol = fs.get("app:temp")

local file = vol:open("/downloaded.json", "w")
local ok, err = storage:download_object("reports/daily.json", file)
file:close()

-- Скачивание части (первый 1KB)
local partial = vol:open("/partial.bin", "w")
storage:download_object("backups/large-file.bin", partial, {
    range = "bytes=0-1023"
})
partial:close()

storage:release()
Параметр Тип Описание
key string Ключ объекта для скачивания
writer Writer Файловый writer назначения
options.range string Диапазон байт (например, "bytes=0-1023")

Возвращает: boolean, error

Перечисление объектов

Список объектов с опциональной фильтрацией по префиксу:

local storage = cloudstorage.get("app.infra:files")

local result, err = storage:list_objects({
    prefix = "reports/2024/",
    max_keys = 100
})

for _, obj in ipairs(result.objects) do
    print(obj.key, obj.size, obj.content_type)
end

-- Пагинация для больших результатов
local token = nil
repeat
    local result = storage:list_objects({
        prefix = "logs/",
        max_keys = 1000,
        continuation_token = token
    })
    for _, obj in ipairs(result.objects) do
        process(obj)
    end
    token = result.next_continuation_token
until not result.is_truncated

storage:release()
Параметр Тип Описание
options.prefix string Фильтр по префиксу ключа
options.max_keys integer Максимум объектов для возврата
options.continuation_token string Токен пагинации

Возвращает: table, error

Результат содержит objects, is_truncated, next_continuation_token.

Удаление объектов

Удалить несколько объектов:

local storage = cloudstorage.get("app.infra:files")

storage:delete_objects({
    "temp/file1.txt",
    "temp/file2.txt",
    "temp/file3.txt"
})

storage:release()
Параметр Тип Описание
keys string[] Массив ключей объектов для удаления

Возвращает: boolean, error

URL для скачивания

Создать временный URL для скачивания объекта без учётных данных. Полезно для передачи файлов внешним пользователям или отдачи контента через приложение.

local storage, err = cloudstorage.get("app.infra:files")
if err then
    return nil, err
end

local url, err = storage:presigned_get_url("reports/quarterly.pdf", {
    expiration = 3600
})

storage:release()

if err then
    return nil, err
end

-- Вернуть URL клиенту для прямого скачивания
return {download_url = url}
Параметр Тип Описание
key string Ключ объекта
options.expiration integer Секунд до истечения URL (по умолчанию: 3600)

Возвращает: string, error

URL для загрузки

Создать временный URL для загрузки объекта без учётных данных. Позволяет клиентам загружать файлы напрямую в хранилище без проксирования через сервер.

local storage, err = cloudstorage.get("app.infra:files")
if err then
    return nil, err
end

local url, err = storage:presigned_put_url("uploads/user-123/avatar.jpg", {
    expiration = 600,
    content_type = "image/jpeg",
    content_length = 1024 * 1024
})

storage:release()

if err then
    return nil, err
end

-- Вернуть URL клиенту для прямой загрузки
return {upload_url = url}
Параметр Тип Описание
key string Ключ объекта
options.expiration integer Секунд до истечения URL (по умолчанию: 3600)
options.content_type string Обязательный content type для загрузки
options.content_length integer Максимальный размер загрузки в байтах

Возвращает: string, error

Методы Storage

Метод Возвращает Описание
upload_object(key, content) boolean, error Загрузить строку или файл
download_object(key, writer, opts?) boolean, error Скачать в файловый writer
list_objects(opts?) table, error Список объектов с фильтром по префиксу
delete_objects(keys) boolean, error Удалить несколько объектов
presigned_get_url(key, opts?) string, error Сгенерировать временный URL для скачивания
presigned_put_url(key, opts?) string, error Сгенерировать временный URL для загрузки
release() boolean Освободить ресурс хранилища

Разрешения

Операции облачного хранилища подчиняются вычислению политики безопасности.

Действие Ресурс Описание
cloudstorage.get ID хранилища Получить ресурс хранилища

Ошибки

Условие Kind Повторяемо
Пустой ID ресурса errors.INVALID нет
Ресурс не найден errors.NOT_FOUND нет
Не ресурс облачного хранилища errors.INVALID нет
Хранилище освобождено errors.INVALID нет
Пустой ключ errors.INVALID нет
Содержимое nil errors.INVALID нет
Writer некорректен errors.INVALID нет
Объект не найден errors.NOT_FOUND нет
Доступ запрещён errors.PERMISSION_DENIED нет
Операция не удалась errors.INTERNAL нет

См. Обработка ошибок для работы с ошибками.