项目产品
开发者文档 / 7 分钟阅读

Node.js实现S3文件上传的代码示例

一、结论

用Node.js实现标准S3协议文件上传的核心思路非常清晰:你只需提前获取对象存储服务商提供的Endpoint、AccessKey、SecretKey、Bucket、Region等核心配置参数,再通过兼容S3协议的官方SDK(如AWS SDK v3)编写调用代码,即可完成文件上传、下载、管理等全链路操作,全程无需对接非标准专有接口,可适配所有支持标准S3协议的对象存储服务。

二、适合哪些开发场景?

该接入方案覆盖绝大多数开发者、站长的文件存储需求,常见适用场景包括:

  • 网站文件上传:将用户提交的头像、内容附件、业务单据等资源直接存储到对象存储,无需占用业务服务器磁盘空间
  • 程序附件存储:SaaS系统、企业内部应用的附件统一托管,支持跨端访问
  • 图床上传:个人博客、自媒体平台、内容站点的图片资源统一存储和分发
  • 下载站资源管理:软件安装包、资料文档、视频资源等大文件的存储和不限量分发
  • Cloudreve、Alist等网盘系统存储源:无需自建存储后端,直接对接作为网盘的底层存储
  • WordPress、Halo等网站附件存储:通过插件配置S3协议,将网站所有媒体资源托管到对象存储
  • 自动化脚本上传下载:定时备份服务器日志、数据库文件到对象存储,实现异地容灾
  • App或SaaS文件管理:移动端、小程序端的用户上传资源统一存储,支持全球加速访问
  • AI数据或模型文件存储:AI训练数据集、模型文件的归档存储和多节点共享调用

三、常见接入方式

方式1:S3 SDK

适合在Node.js后端服务、自动化脚本、Serverless函数中直接集成,实现业务逻辑和文件操作的深度联动,比如前端提交文件后后端直接中转存储,或是后端生成预签名URL供前端直传,无需经过业务服务器。

以下是Node.js使用AWS SDK v3实现通用文件上传的代码示例,所有配置参数替换为自己的实际值即可使用:

```javascript

// 安装依赖:npm install @aws-sdk/client-s3 @aws-sdk/lib-storage

import { S3Client } from "@aws-sdk/client-s3";

import { Upload } from "@aws-sdk/lib-storage";

import * as fs from "fs";

// 初始化S3客户端

const s3Client = new S3Client({

endpoint: "你的对象存储Endpoint地址",

region: "你的Bucket所在区域",

credentials: {

accessKeyId: "你的AccessKey",

secretAccessKey: "你的SecretKey",

},

// 若服务商要求路径式访问,可开启以下配置

// forcePathStyle: true,

});

// 通用上传函数,支持自动分片上传大文件

const uploadFile = async (bucketName, objectKey, filePath, isPublic = false) => {

const fileContent = fs.readFileSync(filePath);

const upload = new Upload({

client: s3Client,

params: {

Bucket: bucketName,

Key: objectKey,

Body: fileContent,

ACL: isPublic ? "public-read" : "private",

},

partSize: 10 * 1024 * 1024, // 单分片大小10MB,超过该大小自动分片

queueSize: 4, // 并发上传的分片数量

});

// 监听上传进度

upload.on("httpUploadProgress", (progress) => {

console.log(当前上传进度:${Math.round((progress.loaded / progress.total) * 100)}%);

});

const result = await upload.done();

return result;

};

// 调用示例:上传本地图片到存储,设置为公开可读

uploadFile("你的Bucket名称", "images/avatar/2024/123.png", "./local/avatar.png", true)

.then((res) => console.log("上传成功,文件访问地址:", res.Location))

.catch((err) => console.error("上传失败,错误信息:", err));

```

方式2:S3 客户端工具

适合开发前测试配置有效性、批量上传测试文件、日常手动管理资源,常用工具包括S3 Browser、CloudBerry Explorer等,只需填入核心配置即可连接存储服务,可视化操作文件。

方式3:rclone / s3cmd 等工具

适合同步、迁移和批量管理文件,比如将本地服务器的备份文件定时同步到对象存储,或是在两个不同的S3兼容存储服务之间直接迁移数据,无需下载到本地中转。

方式4:支持S3的第三方程序

适合无开发能力的用户快速搭建应用,无需编写代码,只需在程序后台选择S3兼容存储选项,填入核心配置即可完成对接,支持的程序包括Cloudreve、Alist、PicGo、Halo、WordPress插件等。

四、核心配置项说明

接入前需要提前准备以下核心参数,所有参数均由存储服务商提供,无需自行生成:

  • Endpoint:对象存储服务的API接入地址,填写时注意不要多余添加http/https前缀、路径后缀,严格按照服务商给出的内容填写
  • AccessKey/SecretKey:身份验证凭证,相当于API访问的账号密码,严禁泄露给第三方,不要硬编码到前端代码、公开的代码仓库中,建议存储在环境变量或加密配置中心
  • Bucket:存储空间名称,是存储文件的顶层容器,需要提前在服务商控制台创建,名称通常要求全局唯一
  • Region:Bucket所在的物理区域,不同服务商的区域命名规则不同,按照控制台给出的实际值填写即可,选择就近区域可提升访问速度
  • Object Key:文件在Bucket内的唯一路径,比如images/avatar/123.png,决定了文件的最终访问路径,可自定义目录结构
  • 访问权限:文件的读写权限,常用的包括private(私有读写,需要签名才能访问)、public-read(公开读,私有写,可直接通过外链访问),按需设置即可
  • 文件访问地址:文件上传成功后生成的访问链接,通常为Bucket.Endpoint/Object Key或Endpoint/Bucket/Object Key格式,具体规则以服务商说明为准

五、通用接入流程

不管是代码接入还是第三方程序对接,都可以按照以下通用流程操作:

1. 在存储服务商控制台创建Bucket,按需设置区域、默认访问权限、跨域规则等配置

2. 在控制台的API密钥管理页面获取AccessKey、SecretKey,在Bucket管理页面获取Endpoint、Region、Bucket名称

3. 在SDK、客户端工具或第三方程序的配置页,选择「S3兼容存储」选项,不要选择特定云厂商的专有存储选项

4. 依次填写Endpoint、AccessKey、SecretKey、Bucket、Region等核心配置,开启HTTPS加密传输选项

5. 上传一个小体积的测试文件,验证上传是否成功

6. 测试文件的读取、下载功能,若为私有文件还需要测试签名访问链接的有效性、过期时间是否符合预期

7. 确认所有测试通过后,将配置接入实际业务流程,建议添加错误重试、上传日志记录等容错机制

六、更简单的接入方案

如果你不想自行搭建MinIO、Ceph等自建对象存储服务,不想花费时间维护存储服务器、处理磁盘扩容、故障排查、网络优化等运维工作,可以选择成熟的兼容标准S3协议的云对象存储服务,开箱即用,按需付费,整体成本远低于自建存储。

如果你需要支持标准S3协议、适合开发者接入、网盘系统存储源、图床和下载分发的对象存储服务,可以了解 七彩云对象存储。

七、FAQ

1. 前端可以直接上传文件到S3存储吗,会不会泄露密钥?

可以实现前端直传,且不会泄露密钥。正确的做法是:后端通过SDK生成带有效期的预签名上传URL,前端拿到该URL后直接将文件上传到S3存储,全程不会将AccessKey、SecretKey暴露到前端,还可以通过预签名配置限制上传文件的大小、类型、有效期,安全性很高。

2. 上传GB级别的大文件经常失败怎么解决?

S3协议原生支持分片上传功能,你可以将大文件拆分成多个分片逐个上传,某个分片上传失败只需重传单个分片,无需重传整个文件。上述代码示例中的Upload类已经自动实现了分片上传逻辑,只需调整partSize参数即可适配不同大小的文件,建议超过100M的文件都使用分片上传。

3. 不同的S3兼容存储服务之间可以直接迁移数据吗?

只要两个存储服务都支持标准S3协议,就可以直接迁移,无需先下载到本地。你可以使用rclone工具分别配置两个存储的接入信息,通过rclone的同步命令直接在两个存储之间传输数据,速度快且不占用本地带宽。

4. 怎么限制指定域名才能访问我的存储资源?

可以在Bucket的跨域资源共享(CORS)配置中添加允许访问的域名白名单,只有白名单内的域名才能请求存储资源,可有效防止资源被盗用。部分服务商还支持Referer防盗链配置,可进一步限制访问来源。

八、总结

通过Node.js接入标准S3协议的对象存储门槛极低,无需对接复杂的专有接口,只需配置几个核心参数即可实现全链路的文件管理操作。你既可以自己编写代码将存储能力深度集成到业务系统,也可以直接使用现成的支持S3协议的第三方程序,快速搭建图床、网盘、下载站等应用。选择成熟的云对象存储服务还可以省去大量运维工作,让你聚焦核心业务的开发,无需在底层存储上投入过多精力。

想进一步了解这个项目?

访问官网查看产品能力、适用场景和最新服务信息。

访问官网

相关文章

开发者文档 / / 8 分钟阅读

S3 ListObjects接口使用方法

一、结论 S3 ListObjects(及迭代版本ListObjectsV2)是标准S3协议下用于列举存储桶内对象的核心接口,接入调用前需提前准备Endpoint、AccessKey、SecretKey、Bucket、Region等核心身份与配置参数,可通过兼容S3的SDK、命令行工具或第三方程序调用,满足对象批量查询、自动化文件管理、存储资源盘点等需求。

开发者文档 / / 8 分钟阅读

Node.js怎么调用S3接口实现大文件分片上传

一、结论 Node.js调用S3接口实现大文件分片上传,核心是使用兼容标准S3协议的官方或第三方SDK,提前准备好Endpoint、AccessKey、SecretKey、Bucket、Region等核心参数,按照分片初始化、分片上传、分片合并的标准流程调用接口即可实现,不需要适配私有API,可直接对接所有支持S3协议的对象存储服务。

开发者文档 / / 7 分钟阅读

Go语言实现大文件分片上传到S3的代码示例

一、结论 使用Go语言实现大文件分片上传到S3兼容对象存储,核心是先获取对应存储服务的Endpoint、AccessKey、SecretKey、Bucket、Region等核心配置,再基于标准S3协议的官方SDK开发上传逻辑即可,所有兼容S3协议的对象存储服务都可以通用这套实现,不需要额外适配非标准接口。

开发者文档 / / 7 分钟阅读

ThinkPHP项目怎么接入S3兼容存储

一、结论 ThinkPHP项目接入S3兼容存储的核心逻辑是基于标准S3协议对接,无需适配私有接口,只需提前获取Endpoint、AccessKey、SecretKey、Bucket、Region这5项核心参数,即可通过兼容S3的SDK、第三方扩展或程序插件完成配置,实现文件上传、下载、外链分发、批量管理等全量功能,所有支持标准S3协议的存储服务均可通用对接。

开发者文档 / / 7 分钟阅读

前端页面大文件直传S3怎么实现

一、结论 前端页面实现大文件直传S3的核心思路是让前端直接与S3兼容存储服务交互,无需经过业务服务器中转,可大幅节省自身服务器带宽与存储资源。操作前需提前准备好S3协议所需的Endpoint、AccessKey、SecretKey、Bucket、Region等配置信息,完成权限和跨域配置后即可接入前端上传逻辑实现大文件传输。