跳转至

对象存储访问

对象存储用于管理当前应用的文件。Hyac 默认使用 RustFS 提供 S3 兼容存储,但用户在控制台和函数代码中通常不需要直接处理 RustFS 访问密钥。

对象存储

对象存储页面展示当前应用 Bucket 的文件。控制台中的上传、下载和预览操作,与函数代码中的 ctx.cloud.storage() 访问的是同一份应用存储。旧入口 ctx.s3 仍保持兼容。

控制台文件管理

进入“对象存储”页面后,看到的是当前应用对应的 Bucket 内容。

支持的常见操作:

  • 浏览文件和文件夹。
  • 上传文件。
  • 下载文件。
  • 删除单个或多个文件。
  • 创建和删除文件夹。
  • 预览图片、音频、视频和 JSON 文件。

如果页面为空,请先确认当前选中的应用是否正确。

路径规则

对象存储使用对象路径,不是真实目录。控制台会用文件夹形式展示路径前缀。

示例:

images/logo.png
exports/report.json
tmp/upload.csv

建议按业务分类组织文件,避免把所有文件放在根目录。

函数中读取文件

函数运行时推荐通过 ctx.cloud.storage() 访问当前应用的对象存储。get() 在读取失败或对象不存在时返回 None,应显式处理。

async def handler(ctx, request):
    storage = ctx.cloud.storage()
    data = await storage.get("demo/hello.txt")
    if data is None:
        return {"ok": False, "message": "file not found or read failed"}

    return {"ok": True, "content": data.decode("utf-8")}

函数中写入文件

async def handler(ctx, request):
    storage = ctx.cloud.storage()
    ok = await storage.put("demo/hello.txt", b"Hello from Hyac")
    if not ok:
        return {"ok": False, "message": "write failed"}

    return {"ok": True}

常见场景

保存函数生成的文件

import json

async def handler(ctx, request):
    payload = {"status": "ok"}
    storage = ctx.cloud.storage()
    ok = await storage.put(
        "exports/result.json",
        json.dumps(payload, ensure_ascii=False).encode("utf-8")
    )
    if not ok:
        return {"saved": False, "message": "write failed"}

    return {"saved": True}

读取用户上传的配置

import json

async def handler(ctx, request):
    storage = ctx.cloud.storage()
    raw = await storage.get("config/settings.json")
    if raw is None:
        return {"error": "settings.json not found"}

    settings = json.loads(raw.decode("utf-8"))
    return {"settings": settings}

权限和隔离

对象存储按应用隔离。一个应用的函数默认只应访问自己的 Bucket。

ctx.s3 是兼容入口,新函数建议使用 ctx.cloud.storage()put() 返回 False 表示写入失败,get() 返回 None 表示读取失败或对象不存在。

不要在函数代码中硬编码全局 S3 密钥。需要访问外部对象存储时,应把外部凭据放在环境变量中,并限制权限。

常见问题

预览失败

确认文件类型是否支持预览。控制台通常支持图片、视频、音频和 JSON;其他文件可以下载后查看。

上传后函数读不到

检查路径是否一致。对象路径区分前缀,demo/a.txta.txt 是两个不同对象。

外部无法访问文件

控制台下载链接由后端生成,是否可外部访问取决于部署域名、Traefik、RustFS 和签名 URL 配置。生产环境应使用 https://oss.<DOMAIN_NAME>