Open hunter-ji opened 2 years ago
前端还在传文件给后端吗?你们的服务器扛得住吗?什么......老板砸钱加机器?!告辞!/狗头
前后端文件传输涉及数据较大,往往会成为很多项目的性能瓶颈。常见的传输方式也有不少,相对来说,OSS直传能够减轻很大压力。
本文我们来列举下常见的和oss直传的几种传输方式,并列举其优劣。
表单上传文件是最常见的方式,前后端开发小伙伴都很轻松,前端哐哐传,后端哐哐收就成了。其过程如下图所示。
优势:
Base64方式上传文件,多常见于小文件,如小图片等,前后端都可直接使用String类型发送和接收。不过在前端,需要将文件转成base64数据,不仅会增加些性能消耗,还会增加传输数据的体积。而对于后端,如果并不是想直接存储base64数据,也还需要将其转成文件再存储,也会增加后端的性能消耗。
String
该上传方式可适用于Resetful Api,也可适用于文件的加密、回调接口携带文件等等。其过程如下图所示。
Resetful Api
劣势:
此处的OSS直传方案都是使用的阿里云的OSS产品,以下将介绍三个方案,可适用于不同的场景。
该方案可在前端直接通过browser.js上传文件到OSS,可分成三步:
browser.js
其流程如下图所示。
Browser.js的方式需要前端安装阿里云的库ali-oss,然后在前端调用。直传还需要OSS账户的Key和Secret,因此为了安全考虑,需要建立RAM账户,然后前端向后端先请求一个STS临时访问凭证来完成直传,其流程如下图所示。
Browser.js
ali-oss
STS
Javascript客户端签名直传,需要先从后端获取临时签名,其流程与上一步的browser.js方案大致相同,不同点在于:
不过该方案做下来,我感觉最大的问题是权限配置有点麻烦....../泪眼
该方案其实是上面方案——Javascript客户端签名直传的升级版本,其加上了后端的上传回调功能。不错呦~
前端需要改动的很少,只需要在请求参数中加上callback参数即可,该参数为后端加密,在签名请求的响应中一起返回回来,内加密了后端回调接口。在前端直传完成后,后端回调接口将会接收到相关文件参数,包括文件路径、大小、类型等。最后OSS会将回调接口response转发给前端,响应直传OSS的请求。
callback
传统方式相比直传OSS,相对来说有三个缺点:
当然,对于规模较小、成本较低的项目来说,常见的上传方式还是适合的,毕竟没有最好的,只有最适合的。
Web端上传介绍
JavaScript客户端签名直传
服务端签名直传并设置上传回调
一. 简介
前端还在传文件给后端吗?你们的服务器扛得住吗?什么......老板砸钱加机器?!告辞!/狗头
前后端文件传输涉及数据较大,往往会成为很多项目的性能瓶颈。常见的传输方式也有不少,相对来说,OSS直传能够减轻很大压力。
本文我们来列举下常见的和oss直传的几种传输方式,并列举其优劣。
二. 常见方式
1. 表单上传
表单上传文件是最常见的方式,前后端开发小伙伴都很轻松,前端哐哐传,后端哐哐收就成了。其过程如下图所示。
优势:
2. Base64上传
Base64方式上传文件,多常见于小文件,如小图片等,前后端都可直接使用
String
类型发送和接收。不过在前端,需要将文件转成base64数据,不仅会增加些性能消耗,还会增加传输数据的体积。而对于后端,如果并不是想直接存储base64数据,也还需要将其转成文件再存储,也会增加后端的性能消耗。该上传方式可适用于
Resetful Api
,也可适用于文件的加密、回调接口携带文件等等。其过程如下图所示。优势:
Resetful Api
,可用于加密、回调等场景,较为灵活劣势:
三. OSS直传
此处的OSS直传方案都是使用的阿里云的OSS产品,以下将介绍三个方案,可适用于不同的场景。
1. Browser.js SDK上传
该方案可在前端直接通过
browser.js
上传文件到OSS,可分成三步:其流程如下图所示。
Browser.js
的方式需要前端安装阿里云的库ali-oss
,然后在前端调用。直传还需要OSS账户的Key和Secret,因此为了安全考虑,需要建立RAM账户,然后前端向后端先请求一个STS
临时访问凭证来完成直传,其流程如下图所示。2. Javascript客户端签名直传
Javascript客户端签名直传,需要先从后端获取临时签名,其流程与上一步的
browser.js
方案大致相同,不同点在于:其流程如下图所示。
不过该方案做下来,我感觉最大的问题是权限配置有点麻烦....../泪眼
3. 服务端签名直传并设置上传回调
该方案其实是上面方案——Javascript客户端签名直传的升级版本,其加上了后端的上传回调功能。不错呦~
前端需要改动的很少,只需要在请求参数中加上
callback
参数即可,该参数为后端加密,在签名请求的响应中一起返回回来,内加密了后端回调接口。在前端直传完成后,后端回调接口将会接收到相关文件参数,包括文件路径、大小、类型等。最后OSS会将回调接口response转发给前端,响应直传OSS的请求。其流程如下图所示。
四. 对比
传统方式相比直传OSS,相对来说有三个缺点:
当然,对于规模较小、成本较低的项目来说,常见的上传方式还是适合的,毕竟没有最好的,只有最适合的。
五. 参考文档
Web端上传介绍
JavaScript客户端签名直传
服务端签名直传并设置上传回调