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

前端实现直传S3的代码示例

一、结论

前端实现直传S3的核心逻辑是先从业务服务端获取临时上传签名,再通过标准S3协议的PutObject或PostObject接口直接上传文件到存储服务,全程不需要经过业务服务端转发,可大幅节省服务端带宽和算力。所有兼容标准S3协议的存储服务都可以通用这套接入逻辑,仅需准备Endpoint、AccessKey、SecretKey、Bucket、Region等核心配置即可。

二、适合哪些开发场景?

  • 网站文件上传:用户头像、内容编辑器附件、用户上传的自定义资源等场景,避免服务端中转带宽消耗
  • 程序附件存储:各类自研应用、SaaS系统的用户文件、业务附件存储
  • 图床上传:个人或商用图床的前端上传功能,支持多格式图片快速上传和外链分发
  • 下载站资源管理:上传软件、资料、安装包等大文件,直接对接存储服务的分发能力
  • Cloudreve、Alist 等网盘系统存储源:作为私有网盘或公共资源盘的底层存储,无需修改网盘核心代码
  • WordPress、Halo 等网站附件存储:通过插件对接后,网站所有媒体文件直接上传到对象存储
  • 自动化脚本上传下载:配合CI/CD流程、定时备份脚本,自动上传构建产物、备份文件到存储服务
  • App 或 SaaS 文件管理:移动端、桌面端应用的文件存储模块,直接调用S3接口实现上传下载
  • AI 数据或模型文件存储:存储训练数据集、模型权重文件,支持大文件分片上传和高速读取

三、常见接入方式

方式1:S3 SDK

适合自定义开发的业务系统直接上传、下载、删除和管理文件,推荐使用官方AWS SDK或社区兼容SDK,前端接入时需配合服务端签名,禁止在前端代码中硬编码SecretKey。以下是通用的前端直传代码示例:

```javascript

// 第一步:服务端生成临时上传签名(以Node.js为例,代码部署在业务服务端,不可暴露到前端)

const AWS = require('aws-sdk');

const s3 = new AWS.S3({

endpoint: 'S3服务接入Endpoint',

accessKeyId: '你的AccessKey',

secretAccessKey: '你的SecretKey',

region: '存储桶所属Region',

signatureVersion: 'v4'

});

// 前端调用的签名获取接口

app.get('/api/get-upload-sign', (req, res) => {

const { fileName, fileType } = req.query;

const objectKey = upload/${Date.now()}-${encodeURIComponent(fileName)};

const params = {

Bucket: '你的存储桶名称',

Key: objectKey,

Expires: 60, // 签名有效期60秒,避免被恶意利用

ContentType: fileType,

ACL: 'public-read' // 根据业务需求设置文件权限,可选私有、公开读等

};

// 生成PutObject接口的临时签名URL

const uploadUrl = s3.getSignedUrl('putObject', params);

// 返回上传地址、文件存储路径和最终访问地址

res.json({

uploadUrl,

objectKey,

accessUrl: 你的文件访问域名前缀/${objectKey}

});

});

```

```javascript

// 第二步:前端直传代码(浏览器端运行)

async function uploadFileToS3(file) {

// 先从业务服务端获取上传签名

const signResponse = await fetch(/api/get-upload-sign?fileName=${encodeURIComponent(file.name)}&fileType=${file.type});

if (!signResponse.ok) throw new Error('获取上传签名失败');

const { uploadUrl, accessUrl } = await signResponse.json();

// 直接上传文件到S3存储服务

const uploadResponse = await fetch(uploadUrl, {

method: 'PUT',

body: file,

headers: {

'Content-Type': file.type

}

});

if (uploadResponse.ok) {

console.log('文件上传成功,访问地址:', accessUrl);

return accessUrl;

} else {

throw new Error('文件上传失败,请重试');

}

}

```

方式2:S3 客户端工具

适合测试存储服务连通性、批量上传静态资源、手动管理存储桶文件,常用工具包括S3 Browser、Transmit、Cyberduck等,只需填入S3配置信息即可可视化管理文件。

方式3:rclone / s3cmd 等工具

适合同步、迁移和批量管理文件,可实现本地服务器与存储桶的定时同步、多存储服务之间的文件迁移、批量删除过期文件等自动化操作,适合运维场景使用。

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

适合无需自定义开发的场景,Cloudreve、Alist、PicGo、Halo、WordPress插件等成熟程序均内置S3兼容模式,只需在后台选择S3存储类型,填入对应配置即可完成接入,无需编写代码。

四、核心配置项说明

  • Endpoint:S3存储服务的接入地址,由服务提供方给出,分为路径式和虚拟主机式两种格式,填写时需注意是否需要携带存储桶前缀
  • AccessKey:身份校验的公开密钥,可在存储服务后台生成,建议使用子账号的AccessKey,分配最小权限
  • SecretKey:身份校验的私密密钥,需严格保密,禁止泄露到前端、公开代码仓库或公网环境
  • Bucket:存储桶的名称,由用户创建时自定义,同一存储服务内全局唯一
  • Region:存储桶所属的区域标识,若服务提供方没有多区域划分,可填写默认值us-east-1或留空
  • Object Key:文件在存储桶内的唯一路径,类似传统文件系统的文件路径,支持自定义目录结构
  • 访问权限:文件的ACL权限,常见包括私有、公开读、公开读写等,需根据业务场景合理设置,避免文件被恶意篡改
  • 文件访问地址:文件上传完成后可访问的外链地址,通常为Endpoint/Object Key或Bucket.Endpoint/Object Key格式,私有文件需生成带签名的临时访问地址

五、通用接入流程

1. 创建或准备Bucket:在存储服务后台创建存储桶,配置跨域CORS规则,允许前端业务域名的跨域请求,同时设置合适的桶权限

2. 获取S3接入信息:在存储服务后台生成AccessKey、SecretKey,获取Endpoint、Region信息,记录存储桶名称

3. 选择接入方式:根据业务场景选择SDK开发、客户端工具、批量管理工具或第三方程序接入,选择S3兼容存储模式

4. 填写配置信息:在对应工具或代码中填入Endpoint、AccessKey、SecretKey、Bucket、Region等配置信息

5. 上传测试文件:上传小体积测试文件,确认上传流程正常,没有报错

6. 测试读取访问:测试文件的下载、外链访问是否正常,私有文件需测试签名临时链接的有效性和过期逻辑

7. 接入实际业务流程:将上传逻辑整合到业务代码中,添加错误重试、断点续传、上传进度提示等优化逻辑,上线正式使用

六、更简单的接入方案

如果不想自行搭建维护MinIO、Ceph等自建存储集群,不需要投入服务器成本、运维人力来处理扩容、带宽峰值、数据备份等问题,可以选择成熟的商用兼容S3协议的云对象存储服务,开箱即用,无需关心底层运维。如果你需要支持标准S3协议、适合开发者接入、网盘系统存储源、图床和不限流量下载分发的对象存储服务,可以了解 七彩云对象存储。

七、FAQ

前端直传S3会泄露SecretKey吗?

不会,正确的接入流程中SecretKey只会存放在业务服务端,前端仅会获取服务端生成的临时签名,签名有有效期限制,且仅对应单个文件的上传权限,不会泄露SecretKey本身,禁止直接在前端代码中硬编码SecretKey。

前端上传时提示跨域错误怎么解决?

需要在存储桶的CORS配置中添加前端业务站点的域名,允许PUT、POST、GET等请求方法,同时允许Content-Type、Authorization等请求头,配置生效后等待几分钟再测试即可。

大文件上传怎么处理更稳定?

对于100M以上的大文件,推荐使用S3的分片上传接口,将大文件拆分成多个固定大小的分片分别上传,全部上传完成后调用合并接口生成完整文件,支持断点续传,中途断网后无需重新上传整个文件,大幅提升大文件上传的成功率。

私有文件怎么生成可分享的临时访问链接?

可以通过S3 SDK的getSignedUrl方法,传入需要访问的Object Key和过期时间,由服务端生成带签名的临时访问链接,链接到期后自动失效,适合需要权限控制的文件分享场景。

不同S3兼容存储服务的代码可以通用吗?

只要是完全兼容标准S3协议的存储服务,核心的上传、下载、签名、管理逻辑都是通用的,仅需要替换对应的Endpoint、Region、密钥等配置项即可,无需修改核心业务代码。

八、总结

前端直传S3是目前主流的文件上传方案,基于标准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等配置信息,完成权限和跨域配置后即可接入前端上传逻辑实现大文件传输。