- 大多数项目多多少少都会存在上传需求。有些项目存在(共有云、私有化部署)(不同环境采用不同对象存储)等情况,这时可能就需要编写多套代码用来接入多种对象存储、还需要考虑大文件正常上传等多个场景。
- 该插件屏蔽了不同对象存储云厂商SDK之间的差异性,提供统一接口来快速接入上传(包含初始化、上传、大文件上传,取消上传、进度回调),节省研发时间。
- 兼容常用对象存储平台:自己编写的本地服务(normal)、obs、oss、minio、aws(V2)。
import ObjectStorage from "object-storage-js"
// 初始化
let instance = new ObjectStorage({
type: normal | oss | obs | minio | aws;
// AK
accessKey?: string;
// SK
secretKey?: string;
// STS-token
securityToken?: string;
// 服务端点
endPoint?: string;
// oss region --- 不传从endpoint中取
region?: string;
// 桶名 直传服务器无需传递该参数
bucketName?: string;
// sdk额外参数
sdkOtherParams?: object;
// sdk库 --- 使用者自己传入,可控制项目中包的大小。
sdkObject?: any;
})
// 上传
instance.upload({
// 文件对象
file: File;
// 文件名 --- 对象存储路径
fileName?: '';
// 最大文件大小字节 --- 如果超出该文件大小,插件自动采用切片上传
maxSize?: number;
// 切片大小字节
partSize?: number;
// 切片上传队列个数 --- 每次保证多少切片并行上传
queueLength?: number;
// 上传地址 --- 本地服务需要
uploadUrl: string;
// 合并地址 --- 本地服务需要
mergeUrl?: string;
// 上传进度回调 -- 文件整体上传进度
onUploadProgress?: (params: ProgressCallback) => void;
// 中断上传 --- 调用回调参数params中的cancel方法取消文件上传
onCancel?: (params: any) => void;
})
<script src="xxx/ObjectStorage.umd.js"></script>
插件暴露出了ObjectStorage全局类用来调用,逻辑同ESM相同
为保证项目的大小,插件未在包中加入云厂商的SDK,需初始化时自行传入项目所需的SDK,插件参数为sdkObject
如需使用aws、minio这类S3协议的SDK,采用aws V2的包(不要用V3)。
传输到自己的服务器时,服务器需采用插件中的参数来定义接口入参(切片上传与普通上传均采用一个接口),例如如下java 代码
// 上传 @PostMapping(value = "upload") public Boolean upload(@RequestParam(value = "file") MultipartFile file // 文件 (切片文件), @RequestParam(value = "chunk", required = false) Integer chunk // 当前片数 (切片需要), @RequestParam(value = "chunks", required = false) Integer chunks // 总片数 (切片需要), @RequestParam(value = "uploadId", required = false) String uploadId // 切片批次上传id(切片需要,该id插件生成,无需服务提供), @RequestParam(value = "fileName", required = false) String fileName // 文件名) // 合并切片(切片上传需要) @GetMapping(value = "merge") public Boolean merge(@RequestParam("uploadId") String uploadId, @RequestParam("fileName") String fileName)
为什么不提供预签名上传参数?
预签名上传无法做到大文件上传,并且前端可直接采用axios等网络请求库直接上传。
为什么不提供断点续传、秒传?
1、断点续传实际应用场景感觉不太大,暂未提供。。。2、上传之前项目可以自己计算文件md5,如果存在就无需调用上传方法。
如何调用SDK提供的额外方法?
插件只封装了上传相关的方法,如果需要调用listBuckets方法等,直接采用new ObjectStorage实例化的对象调用instance成员变量即可(该变量就是SDK初始化后的变量)。
仓库中提供的有简易版的demo,可以作为参考。