You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CloudFlare R2 Bucket媒体文件NodeJS访问失败,求代码修复

CloudFlare R2 NodeJS 访问问题修复方案

原代码存在的问题

  • Authorization头格式错误:R2兼容S3协议,不能直接填入密钥,需要生成标准的AWS4签名
  • 请求头拼写错误:X-Amz-Ac应为X-Amz-Acl
  • 二进制数据处理错误:用res.text()处理图片会导致二进制数据损坏,需用二进制方式读取
  • 日期格式不符合要求:S3要求的日期格式为YYYYMMDD'T'HHMMSS'Z',原代码的处理逻辑有偏差

推荐修复方案(使用AWS SDK,最可靠)

使用官方维护的@aws-sdk/client-s3包,它会自动处理签名逻辑,避免手动构造请求头的错误。

  1. 安装依赖
npm install @aws-sdk/client-s3
  1. 修复后的代码
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");

// 初始化R2客户端
const r2Client = new S3Client({
  region: "auto",
  endpoint: "https://USER_ID.r2.cloudflarestorage.com",
  credentials: {
    accessKeyId: "你的R2访问密钥ID",
    secretAccessKey: "你的R2秘密访问密钥"
  }
});

// 获取图片的异步函数
async function fetchR2Image() {
  try {
    const command = new GetObjectCommand({
      Bucket: "PROJECT_NAME", // R2存储桶名称
      Key: "src/thumbs/BLAHBLAH" // 文件在存储桶中的路径
    });

    const response = await r2Client.send(command);
    // 将响应体转为Buffer(适用于NodeJS环境)
    const imageBuffer = await response.Body.transformToByteArray();
    
    console.log(imageBuffer);
    // 若需保存到本地,可使用fs模块
    // require('fs').writeFileSync('output.jpg', imageBuffer);
  } catch (error) {
    console.error("访问R2失败:", error);
  }
}

// 执行函数
fetchR2Image();

若坚持使用原生Fetch(不推荐)

手动构造S3签名步骤繁琐且易出错,需完成以下操作:

  1. 生成符合S3规范的请求串
  2. 基于密钥计算HMAC-SHA256签名
  3. 正确拼接Authorization头
  4. 确保所有请求头与签名逻辑一致

由于手动实现复杂度高,不建议采用,优先使用SDK方案。

内容的提问来源于stack exchange,提问作者Wraith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:15:39