跳转到内容

云存储

访问 S3 兼容的对象存储。支持上传、下载、列出和管理文件,以及预签名 URL。

存储配置请参阅 云存储

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()
参数类型描述
idstring存储资源 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()
参数类型描述
keystring对象键/路径
contentstring 或 Reader字符串内容或文件读取器
optionstable可选的元数据和条件写入选项

返回: boolean, error

通过选项表附加元数据或对写入设置前置条件:

storage:upload_object("reports/daily.json", body, {
content_type = "application/json",
cache_control = "max-age=3600",
metadata = { owner = "team-a", run_id = "1234" }, -- stored as x-amz-meta-*
only_if_absent = true -- fail if the key already exists
})
选项类型描述
content_typestringMIME 类型
cache_controlstringCache-Control 头部
content_dispositionstringContent-Disposition 头部
content_encodingstringContent-Encoding 头部
metadatatable用户元数据(string 键/值),存储为 x-amz-meta-*
headerstable额外的请求头部(string 键/值)
if_matchstring仅当当前对象 ETag 匹配时写入
if_none_matchstring仅当没有对象匹配该 ETag 时写入("*" 表示任意)
only_if_absentboolean仅当键不存在时写入(if_none_match = "*" 的别名)

未满足前置条件的条件写入会返回 precondition_failed 错误。

将对象下载到文件写入器:

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()
参数类型描述
keystring要下载的对象键
writerWriter目标文件写入器
options.rangestring字节范围(例如 “bytes=0-1023”)
options.if_matchstring仅当对象 ETag 匹配时下载
options.if_none_matchstring仅当 ETag 不匹配时下载

返回: boolean, error

未满足前置条件(if_match/if_none_match)会返回 precondition_failed 错误。

列出对象并可选按前缀过滤:

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.etag)
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.prefixstring按键前缀过滤
options.max_keysinteger返回的最大对象数
options.continuation_tokenstring分页令牌
options.include_ownerboolean包含每个对象的 owneriddisplay_name
options.include_versionsboolean列出对象版本;每项包含 version_id

返回: table, error

结果包含 objectsis_truncatednext_continuation_token。每个对象都有 keysizeetagstorage_class,以及可选的 last_modifiedversion_idowner

在列表结果中 content_type 始终为空——S3 list 操作不返回它。使用 head_object 读取对象的内容类型和元数据。

在不下载对象正文的情况下获取单个对象的元数据:

local storage = cloudstorage.get("app.infra:files")
local meta, err = storage:head_object("reports/daily.json")
if err then
return nil, err
end
print(meta.size, meta.etag, meta.content_type)
for k, v in pairs(meta.metadata) do
print("meta", k, v)
end
storage:release()
参数类型描述
keystring对象键

返回: table, error

结果字段:

字段类型描述
sizeinteger对象大小(字节)
etagstring实体标签
content_typestringMIME 类型
cache_controlstringCache-Control 头部
content_dispositionstringContent-Disposition 头部
content_encodingstringContent-Encoding 头部
storage_classstring存储类别
version_idstring版本 ID(启用版本控制时存在)
last_modifiedinteger最后修改时间(Unix 秒)
metadatatable用户元数据(x-amz-meta-*
headerstable原始响应头部(键名为小写)

不存在的对象会返回 not_found 错误。

删除多个对象:

local storage = cloudstorage.get("app.infra:files")
storage:delete_objects({
"temp/file1.txt",
"temp/file2.txt",
"temp/file3.txt"
})
storage:release()
参数类型描述
keysstring[]要删除的对象键数组

返回: boolean, error

创建允许无凭证下载对象的临时 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}
参数类型描述
keystring对象键
options.expirationintegerURL 过期秒数(默认:3600)

返回: string, error

创建允许无凭证上传对象的临时 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}
参数类型描述
keystring对象键
options.expirationintegerURL 过期秒数(默认:3600)
options.content_typestring上传所需的内容类型
options.content_lengthinteger最大上传大小(字节)

返回: string, error

方法返回描述
upload_object(key, content, opts?)boolean, error上传字符串或文件内容
download_object(key, writer, opts?)boolean, error下载到文件写入器
head_object(key)table, error获取对象元数据
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获取存储资源
条件类型可重试
资源 ID 为空errors.INVALID
资源未找到errors.NOT_FOUND
不是云存储资源errors.INVALID
存储已释放errors.INVALID
键为空errors.INVALID
内容为 nilerrors.INVALID
写入器无效errors.INVALID
对象未找到errors.NOT_FOUND
条件前置条件失败errors.CONFLICT
权限被拒绝errors.PERMISSION_DENIED
操作失败errors.INTERNAL

错误处理请参阅 错误处理