128 lines
5.1 KiB
TypeScript
128 lines
5.1 KiB
TypeScript
import { EntityDict } from '../oak-app-domain';
|
||
import { BRC } from '..';
|
||
import { Cache } from 'oak-frontend-base/es/features/cache';
|
||
import { UploadInterface } from 'oak-frontend-base/es/types/Upload';
|
||
export type UploadFn = UploadInterface['uploadFile'];
|
||
export type UploadToAspect = (file: File | string, name: string, // 文件的part name
|
||
aspectName: string, // 上传的aspect名
|
||
formData: Record<string, any>, // 上传的其它part参数
|
||
autoInform?: boolean) => Promise<any>;
|
||
/**
|
||
* Complicated Object Storage
|
||
* 用于定义在extraFile对象上对文件进行操作的目标类
|
||
* 根据不同的cos服务提供方法实现,如七牛、阿里等
|
||
*/
|
||
export interface Cos<ED extends EntityDict> {
|
||
name: string;
|
||
/**
|
||
* 是否自动通知服务器(不需要主动更新extraFile的uploadState)
|
||
*/
|
||
autoInform(): boolean;
|
||
/**
|
||
* 前台在生成extraFile返回之后调用此函数,获得上传OSS的相应参数
|
||
* 上传成功后,OSS服务器尽量使用通过后台回调服务器的方式去确认上传,若OSS不提供此能力则将autoInform置为false,前台主动在上传成功之后去更新
|
||
* @param extraFile
|
||
* @returns
|
||
*/
|
||
upload: (options: {
|
||
extraFile: ED['extraFile']['OpSchema'];
|
||
uploadFn: UploadFn;
|
||
file: string | File;
|
||
uploadToAspect?: UploadToAspect;
|
||
getPercent?: Function;
|
||
parallelism?: number;
|
||
retryTimes?: number;
|
||
retryDelay?: number;
|
||
onChunkSuccess?: (chunkInfo: EntityDict['extraFile']['Schema']['chunkInfo']) => Promise<void>;
|
||
}) => Promise<void>;
|
||
/**
|
||
* 构建出访问图片的url,注意这个url应当和objectId一对一映射,这样才可以实现多个extraFile之间共享cos上的路径
|
||
*/
|
||
composeFileUrl: (options: {
|
||
application: Partial<ED['application']['Schema']>;
|
||
extraFile: Partial<ED['extraFile']['OpSchema']>;
|
||
cache: Cache<ED>;
|
||
style?: string;
|
||
}) => string;
|
||
}
|
||
export interface CosBackend<ED extends EntityDict> {
|
||
name: string;
|
||
/**
|
||
* 注入在后台extrafile生成之前,将上传所需要的token等信息生成并存放在uploadMeta属性中
|
||
* @param application applciation
|
||
* @param extraFile,要生成的extraFile数据
|
||
* @param context 后台上下文
|
||
* @returns
|
||
*/
|
||
formUploadMeta: (application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC<ED>) => Promise<void>;
|
||
/**
|
||
* 构建出访问图片的url,注意这个url应当和objectId一对一映射,这样才可以实现多个extraFile之间共享cos上的路径
|
||
*/
|
||
composeFileUrlBackend: (options: {
|
||
application: ED['application']['Schema'];
|
||
extraFile: ED['extraFile']['OpSchema'];
|
||
context: BRC<ED>;
|
||
style?: string;
|
||
}) => Promise<string>;
|
||
/**
|
||
* 后台对upload是否成功不确定的文件,向OSS发起主动确认
|
||
* @param extraFile
|
||
* @returns 是否已经上传OSS成功
|
||
*/
|
||
checkWhetherSuccess: (application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC<ED>) => Promise<boolean>;
|
||
/**
|
||
* 后台向OSS发起删除命令
|
||
* @param extraFile
|
||
* @param config
|
||
* @returns
|
||
*/
|
||
removeFile: (application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC<ED>) => Promise<void>;
|
||
/**
|
||
* 取消分片上传
|
||
* @param extraFile
|
||
* @returns
|
||
*/
|
||
abortMultipartUpload: (application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC<ED>) => Promise<void>;
|
||
/**
|
||
* 构建分片上传信息
|
||
*/
|
||
composeChunkUploadInfo: (application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC<ED>) => Promise<{
|
||
uploadId: string;
|
||
chunkSize: number;
|
||
partCount: number;
|
||
parts: Array<{
|
||
partNumber: number;
|
||
uploadUrl: string;
|
||
formData: Record<string, any>;
|
||
}>;
|
||
}>;
|
||
/**
|
||
* 完成分片上传后的合并操作
|
||
*/
|
||
mergeChunkedUpload: (application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC<ED>) => Promise<void>;
|
||
/**
|
||
* 列出分片信息
|
||
*/
|
||
listMultipartUploads: (application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC<ED>) => Promise<{
|
||
parts: Array<{
|
||
partNumber: number;
|
||
etag: string;
|
||
size: number;
|
||
lastModified: Date;
|
||
}>;
|
||
}>;
|
||
/**
|
||
* 对一个文件进行预签名,可以用于下载或上传
|
||
* @param methods HTTP方法
|
||
* @param application 应用
|
||
* @param extraFile 文件
|
||
* @param context 后台上下文
|
||
* @returns 预签名的url及相关信息
|
||
*/
|
||
presignFile: (methods: 'GET' | 'PUT' | 'POST' | 'DELETE', application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC<ED>) => Promise<{
|
||
url: string;
|
||
headers?: Record<string, string | string[]>;
|
||
formdata?: Record<string, any>;
|
||
}>;
|
||
}
|