大文件上传
1 实现思路
- 前端上传大文件时使用 Blob.prototype.slice 将文件切片,并发上传多个切片,最后发送一个合并的请求通知服务端合并切片
- 服务端接收切片并存储,收到合并请求后使用流将切片合并到最终文件
- 前端使用Web Worker来进行高耗时任务。如果让浏览器中JS有大量计算时,会造成 UI 阻塞,出现界面卡顿、掉帧等情况,严重时还会出现页面卡死等情况(其实很容易触发,例如让你计算十万条数据)。
- 原生 XMLHttpRequest 的 upload.onprogress 对切片上传进度的监听
- 使用 Vue 计算属性根据每个切片的进度算出整个文件的上传进度
2 断点续传、秒传
- 使用 spark-md5 根据文件内容算出文件 hash
- 通过 hash 可以判断服务端是否已经上传该文件,从而直接提示用户上传成功(秒传)
- 通过 XMLHttpRequest 的 abort 方法暂停切片的上传
- 上传前服务端返回已经上传的切片名,前端跳过这些切片的上传
3 OSS对象存储服务
定义
首先OSS的英文全称是Object Storage Service, 直译过来就是”对象存储服务“。 严谨的解释是:OSS是一种使用HTTP API存储和检索非结构化数据和元素的数据对象的工具。 要点:
- HTTP API风格
- 存储数据
- 检索数据
通俗易懂的说就是:OSS就是通过HTTP restful风格的API进行数据上传,存储和获取的云端数据库服务。你也可以简单的理解成网盘。
服务供应商: 阿里云,蓝队云,移动云,AWS存储
OSS的相关术语
1. Object 对象
Object是OSS服务存储的基本单元。我们也可以称之为OSS的文件。Object通常由Object Meta(对象元信息,描述信息),Data(数据),和Key(文件名/文件标识)组成。Key是存储空间中的唯一标识,类似于数据库中的Primary key。
2. Bucket 存储空间
Bucket是用户用于存储对象的容器,所有的对象都必须隶属于某个存储空间。
3. Region 地域
Region表示OSS的数据中心所在的物理位置。地域选项是由供应商提供的,用户通常可以通过不同资费和需求来选择适合自己的地域服务。
4. Endpoint 访问域名
Endpoint表示OSS对外服务的访问域名(你的网盘地址)。OSS对外的API是符合RESTful请求风格的。另外不同Region下Endpoint会有所不同。具体的Endpoint要看服务供应商的提供。
5. AccessKey 访问秘钥 (AK)
AccessKey简称AK,用于访问资源时验证身份。AccessKey通常包括 AccessId 和 AccessKeySecret。OSS通过使用用AccessKey和AccessKeySecret对称加密的方式来校验身份。 AccessId是用户的标识,AccessKeySecret是用于加密的签名,可以理解为私钥。所以AccessKeySecret必须保密处理。
OSS的优点
- HTTP RESTful 规范的交互,简单明了,并且具有多平台和系统的通用性。
- 合理的资源分配,对于静态资源的处理使用OSS可以降低个人服务的资源压力
- 集成CDN,对资源进行缓存处理,提升资源访问速度
- 资源版本控制,方便资源在意外覆盖时恢复。
- 灵活的扩展性,想要更多的服务,给更多的钱。
- 对静态资源进行进一步的封装,降低了系统本身体系结构的复杂度,符合分布式服务的设计理念。
OSS的缺点
- 无法像传统数据库一样维护数据库结构。
- 存储对象不允许进行片的更改,只能修改整个对象,会有性能问题