如何配置AWS S3存储桶策略实现文件公开可读?求Node.js代码示例
配置AWS S3存储桶让上传文件公开可读 + Node.js代码示例
一、存储桶策略配置步骤
- 登录AWS控制台,打开S3服务,选中目标存储桶。
- 切换到「权限」标签页,找到「存储桶策略」选项并点击「编辑」。
- 粘贴以下策略代码,将
your-bucket-name替换为你的存储桶名称:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*" } ] }
- 简单说明:这个策略允许所有用户执行
s3:GetObject(读取文件)操作,覆盖存储桶内所有对象。
- 检查并关闭存储桶及账户级别的「阻止公共访问」设置,否则策略无法生效。
二、Node.js代码示例
前置准备
- 安装AWS SDK v3(推荐新版本):
npm install @aws-sdk/client-s3 @aws-sdk/lib-storage
- 配置AWS凭证:可以通过环境变量设置,或在本地创建
~/.aws/credentials(Windows路径为C:\Users\你的用户名\.aws\credentials),内容格式如下:
[default] aws_access_key_id = 你的Access Key ID aws_secret_access_key = 你的Secret Access Key
上传单个文件并设置公开可读
const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3"); const fs = require("fs"); // 初始化S3客户端 const s3Client = new S3Client({ region: "你的存储桶所在区域,比如us-east-1" }); async function uploadPublicFile() { const params = { Bucket: "your-bucket-name", // 替换为你的存储桶名 Key: "demo/public-image.png", // 文件在S3中的存储路径+名称 Body: fs.createReadStream("./local-image.png"), // 本地文件路径 ACL: "public-read" // 核心参数:设置文件公开可读 }; try { await s3Client.send(new PutObjectCommand(params)); // 生成公开访问链接 const publicUrl = `https://${params.Bucket}.s3.${s3Client.config.region}.amazonaws.com/${params.Key}`; console.log("文件上传成功,公开链接:", publicUrl); } catch (err) { console.error("上传失败:", err); } } // 执行上传 uploadPublicFile();
可选:批量修改已有文件为公开可读
如果需要将存储桶内已有的文件批量设置为公开可读,可使用以下代码:
const { S3Client, ListObjectsV2Command, PutObjectAclCommand } = require("@aws-sdk/client-s3"); const s3Client = new S3Client({ region: "你的存储桶区域" }); const bucketName = "your-bucket-name"; async function batchSetPublicAcl() { let nextToken; do { // 分页获取存储桶内文件列表 const listRes = await s3Client.send(new ListObjectsV2Command({ Bucket: bucketName, ContinuationToken: nextToken })); // 遍历文件设置ACL for (const item of listRes.Contents) { await s3Client.send(new PutObjectAclCommand({ Bucket: bucketName, Key: item.Key, ACL: "public-read" })); console.log(`已设置 ${item.Key} 为公开可读`); } nextToken = listRes.NextContinuationToken; } while (nextToken); console.log("所有文件处理完成"); } batchSetPublicAcl();
注意事项
- 公开存储桶或文件意味着所有人都能访问,请勿上传敏感数据。
- 确保你的AWS凭证拥有足够权限(如
s3:PutObject、s3:PutObjectAcl、s3:ListBucket等)。
内容的提问来源于stack exchange,提问作者Viranga Bogahalanda
相关产品推荐
相关产品推荐

