import Resume from './resume' import Direct from './direct' import Logger from '../logger' import {UploadCompleteData} from '../api' import {Observable, IObserver, MB, normalizeUploadConfig} from '../utils' import {QiniuError, QiniuNetworkError, QiniuRequestError} from '../errors' import {UploadOptions, UploadHandlers, UploadProgress, Config} from './base' export * from './base' export * from './resume' export function createUploadManager( options: UploadOptions, handlers: UploadHandlers, logger: Logger ) { if (options.config && options.config.forceDirect) { logger.info('ues forceDirect mode.') return new Direct(options, handlers, logger) } if (options.file.size > 5 * MB) { logger.info('file size over 5M, use Resume.') return new Resume(options, handlers, logger) } logger.info('file size less or equal than 5M, use Direct.') return new Direct(options, handlers, logger) } /** * @param file 上传文件 * @param key 目标文件名 * @param token 上传凭证 * @param config 上传任务的配置 * @returns 返回用于上传任务的可观察对象 */ export default function upload( file: File, key: string | undefined, token: string, config?: Config ): Observable { // 为每个任务创建单独的 Logger const logger = new Logger(token, config?.disableStatisticsReport, config?.debugLogLevel, file.name) const options: UploadOptions = { file, key, token, config: normalizeUploadConfig(config, logger) } // 创建 host 池 // const hostPool = new HostPool(options.config.uphost) return new Observable((observer: IObserver) => { const manager = createUploadManager(options, { onData: (data: UploadProgress) => observer.next(data), onError: (err: QiniuError) => observer.error(err), onComplete: (res: any) => observer.complete(res) }, logger) manager.putFile() return manager.stop.bind(manager) }) }