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包,它会自动处理签名逻辑,避免手动构造请求头的错误。
- 安装依赖
npm install @aws-sdk/client-s3
- 修复后的代码
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签名步骤繁琐且易出错,需完成以下操作:
- 生成符合S3规范的请求串
- 基于密钥计算HMAC-SHA256签名
- 正确拼接Authorization头
- 确保所有请求头与签名逻辑一致
由于手动实现复杂度高,不建议采用,优先使用SDK方案。
内容的提问来源于stack exchange,提问作者Wraith
相关产品推荐
相关产品推荐

