微信小程序上传文件到阿里云OSS

Database and Ruby, Python, History


在微信小程序开发中,将文件上传到阿里云 OSS 是一项常见需求。最安全、高效的方案是直传方案:服务端不直接中转文件,而是计算并颁发一个“签名通行证”,小程序凭借该签名直接将文件安全地上传至 OSS。

本文将带你快速梳理微信小程序直传阿里云 OSS 的核心流程。

1. 服务端:生成并颁发上传签名

为了保证 Bucket 的安全,OSS 要求客户端上传时必须携带有效的签名。服务端的唯一职责就是计算这个签名并提供给小程序。

  • 获取 STS 临时凭证:强烈建议让后端实例扮演 RAM 角色,通过访问 STS 服务动态获取临时凭证,避免在代码中硬编码 AccessKey。
  • 计算 POST V4 签名:服务端根据 STS 凭证和上传策略(Policy,用于限制上传目录、文件大小、有效期等),计算出 HMAC-SHA256 签名。

服务端需要暴露一个 API(如 /generate_signature),向小程序返回以下关键参数:

  • policy:Base64 编码的上传策略。
  • x_oss_signature_version:固定为 OSS4-HMAC-SHA256
  • x_oss_credential:派生密钥参数集。
  • x_oss_date:请求时间。
  • signature:最终计算出的签名字符串。
  • security_token:STS 安全令牌。

附:POST V4 签名核心逻辑

  1. 创建 Policy:定义带过期时间和限制条件的 JSON 策略。
  2. 构造 StringToSign:对 Policy 进行 Base64 编码。
  3. 计算 SigningKey:使用 AK Secret、日期、地域、服务名(oss)等多重 HMAC-SHA256 哈希派生出专用密钥。
  4. 生成 Signature:使用 SigningKey 对 StringToSign 加密,转化为十六进制字符串。

2. 小程序后台:配置合法域名

为了防止请求被微信拦截,必须在公众平台配置合法域名:

  1. 登录阿里云 OSS 控制台,获取目标 Bucket 的外网访问域名
  2. 登录微信公众平台,在“开发 - 开发管理 - 开发设置”中,将该域名填入上传和下载合法域名白名单。

3. 小程序端:获取签名并直传

在小程序端,逻辑分为两步:先请求签名,再上传文件。

// 1. 获取服务端签名信息
const authRes = await wx.request({
  url: "https://your-backend.com/generate_signature",
});
const authData = authRes.data;

// 2. 选择文件并直传 OSS
wx.chooseMessageFile({
  count: 1,
  success: (res) => {
    const filePath = res.tempFiles[0].path;

    wx.uploadFile({
      url: "https://examplebucket.oss-cn-hangzhou.aliyuncs.com", // 替换为你的 Bucket 域名
      filePath: filePath,
      name: "file", // 必须为 file
      formData: {
        key: "user/eric/filename.txt", // OSS 存储路径
        policy: authData.policy,
        "x-oss-signature-version": authData.x_oss_signature_version,
        "x-oss-credential": authData.x_oss_credential,
        "x-oss-date": authData.x_oss_date,
        "x-oss-security-token": authData.security_token,
        signature: authData.signature,
        success_action_status: "200", // 指定成功状态码
      },
      success: (uploadRes) => {
        if (uploadRes.statusCode === 200) {
          console.log("上传成功");
        }
      },
    });
  },
});

总结

微信小程序直传 OSS 方案的核心在于权限的解耦:服务端收口权限与签名计算,客户端负责繁重的文件传输。这种架构不仅减轻了服务端的带宽压力,还能有效利用 OSS 的边缘节点加速能力,是生产环境中处理文件上传的最佳实践。

吐槽

阿里云其实有很好的文档和代码写了如何上传,比如介绍 V4 签名 API小程序如何上传 OSS,但是这篇文章又是过期的,介绍的是 V1 签名方法。