import Qiniu from 'qiniu4js-async/qiniu4js.es'; export const randomImg = function() { const chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; let nums = ''; for (let i = 0; i < 32; i++) { const id = Math.round(Math.random() * 61); nums += chars[id]; } return nums; } export interface CDNMiddleWare { onIntercept?: (task) => Promise; onInterrupt?: (task) => boolean; onReady?: (task) => void; onProgress?: (task) => void; onSuccess?: (task, baseUrl: string) => void; onFail?: (task) => void; onFinish?: (task) => void; onRetry?: (task) => void; onStart?: (task) => void; } export class QiniuUploader { private middleWares: CDNMiddleWare[] = []; private uploader: Qiniu.Uploader; private token:string; private url:string; addMiddleWares(middleWare: CDNMiddleWare) { this.middleWares.push(middleWare); } popupUplod() { this.uploader.chooseFile(); } upload(file) { (this.uploader.fileInput as any).files = file; this.uploader.handleFiles() } init(accept,token,url) { const interceptor = { // 拦截任务,返回true,任务将会从任务队列中剔除,不会被上传 onIntercept: async (task) => { let ifIntercept = false; for (const middleWare of this.middleWares) { if (middleWare.onIntercept) { ifIntercept = ifIntercept || await middleWare.onIntercept(task); } } return ifIntercept; }, onInterrupt: (task) => { return this.middleWares.map(e => { if (e.onInterrupt) { return e.onInterrupt(task); } return false; }).reduce((p, n) => { return p || n; }, false); }, }; this.token = token, this.url = url this.uploader = new Qiniu.UploaderBuilder() .debug(false) // 开启debug,默认false .retry(3) // 设置重传次数,默认0,不重传 .accept(accept) .domain("https://up-z1.qiniup.com") .size(1024 * 1024) // 分片大小,最多为4MB,单位为字节,默认1MB .chunk(true) // 是否分块上传,默认true,当chunk=true并且文件大于4MB才会进行分块上传 .auto(true) // 选中文件后立即上传,默认true .multiple(false) // 是否支持多文件选中,默认true .tokenShare(true) .tokenFunc(async (setToken, task) => { setToken(token); }) .interceptor(interceptor) .listener({ onReady: (tasks) => { this.middleWares.forEach((e) => { if (e.onReady) e.onReady(tasks); }); }, onStart: (tasks) => { this.middleWares.forEach((e) => { if (e.onStart) e.onStart(tasks); }); }, onTaskGetKey: (task) => { const splits = task.file.name.split('.'); return 'creativity/' + randomImg() + '.' + splits[splits.length - 1]; }, onTaskProgress: (task) => { this.middleWares.forEach((e) => { if (e.onProgress) e.onProgress(task); }); }, onTaskSuccess: async (task) => { this.middleWares.forEach((e) => { if (e.onSuccess) e.onSuccess(task, url + (task.result as any).key); }); }, onTaskFail: (task) => { this.middleWares.forEach((e) => { if (e.onFail) e.onFail(task); }); }, onTaskRetry: (task) => { this.middleWares.forEach((e) => { if (e.onRetry) e.onRetry(task); }); }, onFinish: (tasks) => { this.middleWares.forEach((e) => { if (e.onFinish) e.onFinish(tasks); }); }, }) .build(); return this.uploader } } export default QiniuUploader