import { EntityDict } from '../oak-app-domain'; import { BRC } from '..'; import { Cache } from 'oak-frontend-base/es/features/cache'; export type UploadFn = (file: File | string | Blob, name: string, // 文件的part name uploadUrl: string, // 上传的url formData: Record, // 上传的其它part参数 autoInform?: boolean, // 上传成功是否会自动通知server(若不会则需要前台显式通知 getPercent?: Function, uploadId?: string, method?: "POST" | "PUT") => Promise; export type UploadToAspect = (file: File | string, name: string, // 文件的part name aspectName: string, // 上传的aspect名 formData: Record, // 上传的其它part参数 autoInform?: boolean) => Promise; /** * Complicated Object Storage * 用于定义在extraFile对象上对文件进行操作的目标类 * 根据不同的cos服务提供方法实现,如七牛、阿里等 */ export interface Cos { 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; }) => Promise; /** * 构建出访问图片的url,注意这个url应当和objectId一对一映射,这样才可以实现多个extraFile之间共享cos上的路径 */ composeFileUrl: (options: { application: Partial; extraFile: Partial; cache: Cache; style?: string; }) => string; } export interface CosBackend { 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) => Promise; /** * 构建出访问图片的url,注意这个url应当和objectId一对一映射,这样才可以实现多个extraFile之间共享cos上的路径 */ composeFileUrlBackend: (options: { application: ED['application']['Schema']; extraFile: ED['extraFile']['OpSchema']; context: BRC; style?: string; }) => Promise; /** * 后台对upload是否成功不确定的文件,向OSS发起主动确认 * @param extraFile * @returns 是否已经上传OSS成功 */ checkWhetherSuccess: (application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC) => Promise; /** * 后台向OSS发起删除命令 * @param extraFile * @param config * @returns */ removeFile: (application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC) => Promise; /** * 取消分片上传 * @param extraFile * @returns */ abortMultipartUpload: (application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC) => Promise; /** * 构建分片上传信息 */ composeChunkUploadInfo: (application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC) => Promise<{ uploadId: string; chunkSize: number; partCount: number; parts: Array<{ partNumber: number; uploadUrl: string; formData: Record; }>; }>; /** * 完成分片上传后的合并操作 */ mergeChunkedUpload: (application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC) => Promise; /** * 列出分片信息 */ listMultipartUploads: (application: ED['application']['Schema'], extraFile: ED['extraFile']['OpSchema'], context: BRC) => Promise<{ parts: Array<{ partNumber: number; etag: string; size: number; lastModified: Date; }>; }>; }