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

Amazon S3如何配置实现Node.js上传文件后自动公开可访问对象URL?

Node.js上传图片到Amazon S3并直接访问对象URL完整实现步骤

1. 前置准备

  • 已激活AWS账号,获取到具备S3上传权限的Access Key ID和Secret Access Key
  • 本地/服务器环境已安装Node.js和npm/yarn包管理工具
  • 已提前创建好用于存储图片的S3存储桶(Bucket)

2. S3存储桶权限配置(核心步骤,决定上传后能否直接访问)

默认S3存储桶是私有权限,必须完成以下配置才能公开访问对象:

  • 关闭存储桶公开访问限制:进入S3控制台对应Bucket的「权限」选项卡,找到「阻止公开访问(存储桶设置)」,编辑后关闭全部4个限制选项,保存更改
  • 配置存储桶公开读策略:在同个权限选项卡找到「存储桶策略」,粘贴如下配置,将<你的Bucket名称>替换为实际桶名后保存:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<你的Bucket名称>/*"
        }
    ]
}
  • (可选)若需要前端跨域访问图片,配置CORS规则:在权限选项卡找到「跨域资源共享(CORS)」,粘贴如下规则,可按需调整允许的源域名:
[
    {
        "AllowedHeaders": ["*"],
        "AllowedMethods": ["GET", "PUT", "POST"],
        "AllowedOrigins": ["*"],
        "ExposeHeaders": []
    }
]

3. Node.js服务端代码实现

3.1 安装依赖包

执行命令安装所需工具:
npm install aws-sdk express multer multer-s3

依赖说明:aws-sdk为AWS官方工具包,multer用于处理文件上传请求,multer-s3是multer对接S3的扩展组件

3.2 编写上传逻辑

const express = require('express');
const AWS = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');

const app = express();
const port = 3000;

// 配置AWS鉴权信息
AWS.config.update({
  accessKeyId: '替换为你的Access Key ID',
  secretAccessKey: '替换为你的Secret Access Key',
  region: '替换为Bucket所在区域,例如ap-southeast-1、us-east-1'
});

const s3 = new AWS.S3();

// 配置上传规则
const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: '替换为你的Bucket名称',
    acl: 'public-read', // 核心配置:上传的对象默认设置为公开可读
    key: function (req, file, cb) {
      // 自定义S3上存储的文件名,用时间戳前缀避免重名覆盖
      cb(null, Date.now().toString() + '-' + file.originalname);
    }
  })
});

// 单图片上传接口
app.post('/upload', upload.single('image'), (req, res) => {
  // 上传完成后直接返回可公开访问的S3对象URL
  res.json({
    code: 200,
    message: '上传成功',
    imageUrl: req.file.location
  });
});

app.listen(port, () => {
  console.log(`服务已启动,监听端口${port}`);
});

生产环境注意:不要硬编码AK/SK到代码中,建议通过环境变量、AWS IAM角色等更安全的方式加载鉴权信息

4. 功能验证

  • 启动Node.js服务,用接口测试工具向http://localhost:3000/upload发送form-data格式的POST请求,参数key填image,value选择本地图片文件
  • 拿到接口返回的imageUrl,直接粘贴到浏览器地址栏即可正常访问图片

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:39:04