UNPKG

xdesign-vue-next

Version:

XDesign Component for vue-next

1 lines 30.1 kB
{"version":3,"file":"main.mjs","sources":["../../../../src/_common/js/upload/main.ts"],"sourcesContent":["import isFunction from 'lodash/isFunction';\nimport isNumber from 'lodash/isNumber';\n/* eslint-disable no-param-reassign */\nimport { getCurrentDate, isOverSizeLimit } from './utils';\nimport xhr from './xhr';\nimport log from '../log/log';\nimport {\n UploadFile,\n SizeLimitObj,\n FileChangeParams,\n FileChangeReturn,\n RequestMethodResponse,\n HandleUploadParams,\n SuccessContext,\n handleSuccessParams,\n UploadTriggerUploadText,\n ErrorContext,\n} from './types';\n\nexport interface BeforeUploadExtra {\n /** 图片文件大小限制 */\n sizeLimit?: number | SizeLimitObj;\n /** 上传文件之前的钩子,参数为上传的文件,返回值决定是否上传 */\n beforeUpload?: (file: UploadFile) => boolean | Promise<boolean>;\n}\n\nexport type BeforeUploadPromiseList = [Promise<SizeLimitObj>, undefined | Promise<boolean>]\n\nexport function handleBeforeUpload(\n file: UploadFile, params: BeforeUploadExtra,\n): Promise<[SizeLimitObj, boolean]> {\n const { sizeLimit, beforeUpload } = params;\n // 文件大小校验\n const sizePromise = new Promise<SizeLimitObj>((resolve) => {\n let result: SizeLimitObj = null;\n if (sizeLimit) {\n const sizeLimitObj: SizeLimitObj = isNumber(sizeLimit)\n ? { size: sizeLimit, unit: 'KB' }\n : sizeLimit;\n const limit = isOverSizeLimit(file.size, sizeLimitObj.size, sizeLimitObj.unit);\n if (limit) {\n result = sizeLimitObj;\n }\n }\n resolve(result);\n });\n\n // 自定义校验\n const promiseList: BeforeUploadPromiseList = [sizePromise, undefined];\n if (isFunction(beforeUpload)) {\n const r = beforeUpload(file);\n const p = r instanceof Promise ? r : (new Promise<boolean>((resolve) => resolve(r)));\n promiseList[1] = p;\n }\n\n // 同时进行文件大小校验和自定义校验函数\n return new Promise((resolve) => {\n Promise.all(promiseList).then((r) => {\n resolve(r);\n });\n });\n}\n\nexport interface OnErrorParams extends ErrorContext {\n formatResponse?: HandleUploadParams['formatResponse'];\n}\n\nexport function handleError(options: OnErrorParams) {\n const { event, files, response, XMLHttpRequest, formatResponse } = options;\n files.forEach((file) => {\n file.status = 'fail';\n });\n let res = response;\n if (isFunction(formatResponse)) {\n res = formatResponse(response, { file: files[0], currentFiles: files });\n }\n return { response: res, event, files, XMLHttpRequest };\n}\n\nexport function handleSuccess(params: handleSuccessParams) {\n const { event, files, response, XMLHttpRequest } = params;\n if (files?.length <= 0) {\n log.error('Upload', 'Empty File in Success Callback');\n }\n files.forEach((file) => {\n file.percent = 100;\n file.status = 'success';\n delete file.response?.error;\n });\n const res = response;\n files[0].url = res.url || files[0].url;\n return { response: res, event, files, XMLHttpRequest };\n}\n\nexport type UploadRequestReturn = {\n status?: 'fail' | 'success';\n /** 上传失败的文件,需等待继续上传 */\n failedFiles?: UploadFile[];\n data?: SuccessContext;\n /** 批量文件上传,一个文件一个请求的场景下,响应结果的列表 */\n list?: UploadRequestReturn[];\n}\n\nexport function handleRequestMethodResponse(res: RequestMethodResponse) {\n if (!res) {\n log.error('Upload', '`requestMethodResponse` is required.');\n return false;\n }\n if (!res.status) {\n log.error('Upload', '`requestMethodResponse.status` is missing, which value only can be `success` or `fail`');\n return false;\n }\n if (!['success', 'fail'].includes(res.status)) {\n log.error('Upload', '`requestMethodResponse.status` must be `success` or `fail`, examples `{ status: \\'success\\', response: { url: \\'\\' } }`');\n return false;\n }\n if (res.status === 'success' && (!res.response || (!res.response.url && !res.response.files))) {\n log.warn('Upload', '`requestMethodResponse.response.url` or `requestMethodResponse.response.files` is required if `status` is `success`');\n }\n return true;\n}\n\n/**\n * 一次上传请求的返回结果\n */\nexport function uploadOneRequest(params: HandleUploadParams): Promise<UploadRequestReturn> {\n const { action, toUploadFiles, requestMethod } = params;\n return new Promise<UploadRequestReturn>((resolve) => {\n if (!action && !requestMethod) {\n log.error('Upload', 'one of action and requestMethod must be exist.');\n resolve({});\n return;\n }\n if (!toUploadFiles || !toUploadFiles.length) {\n log.warn('Upload', 'No files need to be uploaded');\n resolve({});\n return;\n }\n toUploadFiles.forEach((file) => {\n file.status = 'progress';\n });\n // 自定义上传方法\n if (requestMethod) {\n requestMethod(params.multiple ? toUploadFiles : toUploadFiles[0]).then((res) => {\n if (!handleRequestMethodResponse(res)) {\n resolve({});\n return;\n }\n const { response = {} } = res;\n if (res.status === 'fail') {\n response.error = res.error || response.error;\n }\n let resultFiles: UploadFile[] = [];\n if (res.status === 'success' && response.files) {\n // 一个请求上传并返回多个文件\n resultFiles = response.files.map((file: UploadFile) => {\n const fileInfo = toUploadFiles.find((toFile) => (\n (file.name && toFile.name === file.name) || (file.raw && toFile.raw === file.raw)\n ));\n return {\n ...fileInfo,\n ...file,\n status: res.status,\n response,\n };\n });\n } else {\n // 一个请求上传并返回一个文件\n toUploadFiles.forEach((file) => {\n file.status = res.status;\n file.response = response;\n file.url = response.url;\n file.percent = res.status === 'success' ? 100 : 0;\n // 如果上传请求返回结果没有上传日期,则使用电脑当前日期显示\n file.uploadTime = response?.uploadTime || getCurrentDate();\n });\n resultFiles = toUploadFiles;\n }\n const result = {\n response,\n file: resultFiles[0],\n files: resultFiles,\n };\n if (res.status === 'success') {\n params.onResponseSuccess?.(result);\n } else if (res.status === 'fail') {\n params.onResponseError?.(result);\n }\n resolve({\n status: res.status,\n data: result,\n });\n });\n } else {\n const xhrReq = xhr({\n action: params.action,\n files: params.toUploadFiles,\n useMockProgress: params.useMockProgress,\n mockProgressDuration: params.mockProgressDuration,\n onError: (p: ErrorContext) => {\n const r = handleError({ ...p, formatResponse: params.formatResponse });\n params.onResponseError?.(r);\n resolve({ status: 'fail', data: r });\n },\n onProgress: params.onResponseProgress,\n onSuccess: (p: SuccessContext) => {\n const { formatResponse } = params;\n let res = p.response;\n if (isFunction(formatResponse)) {\n res = formatResponse(p.response, {\n file: p.file,\n currentFiles: p.files,\n });\n }\n if (res.error) {\n const r = handleError({ ...p, response: res });\n params.onResponseError?.(r);\n resolve({ status: 'fail', data: r });\n } else {\n p.file.response = res;\n p.files[0].response = res;\n const r = handleSuccess({ ...p, response: res });\n params.onResponseSuccess?.(r);\n resolve({ status: 'success', data: r });\n }\n },\n formatRequest: params.formatRequest,\n data: params.data,\n name: params.name,\n headers: params.headers,\n withCredentials: params.withCredentials,\n method: params.method,\n });\n params.setXhrObject?.({\n files: params.toUploadFiles,\n xhrReq,\n });\n }\n });\n}\n\nfunction updateUploadedFiles(uploadFiles: UploadFile[], resultFiles: UploadFile[]) {\n const existFiles = uploadFiles.filter((t) => t.url);\n const newFiles = existFiles;\n for (let i = 0, len = resultFiles.length; i < len; i++) {\n const file = resultFiles[i];\n const index = uploadFiles.findIndex((item) => (\n (item.raw && item.raw === file.raw) || (item.name && item.name === file.name)\n ));\n const tmpFile = index >= 0 ? { ...uploadFiles[index], ...file } : file;\n newFiles.push(tmpFile);\n }\n return newFiles;\n}\n\n/**\n * 可能单个文件上传,也可能批量文件一次性上传\n * 返回上传成功或上传失败的文件列表\n */\nexport function upload(params: HandleUploadParams):\nPromise<UploadRequestReturn> {\n const { uploadAllFilesInOneRequest, toUploadFiles, uploadedFiles, isBatchUpload } = params;\n // 一批文件上传,部分文件失败,重新上传失败的文件\n const thisUploadFiles = toUploadFiles.filter((t) => (\n !t.response || (t.response && !t.response.error)\n ));\n return new Promise((resolve) => {\n // 所有文件一次性上传\n if (uploadAllFilesInOneRequest || !params.multiple) {\n uploadOneRequest(params).then((r) => {\n if (r.status === 'success') {\n r.data.files = isBatchUpload || !params.multiple\n ? r.data.files\n : updateUploadedFiles(uploadedFiles, r.data.files);\n }\n const failedFiles = r.status === 'fail' ? r.data.files : [];\n resolve({ ...r, failedFiles });\n });\n return;\n }\n // 一个文件一个文件上传\n const list = thisUploadFiles.map((file) => (\n uploadOneRequest({ ...params, toUploadFiles: [file] })\n ));\n Promise.all(list).then((arr) => {\n const files: UploadFile[] = [];\n const failedFiles: UploadFile[] = [];\n arr.forEach((one) => {\n if (one.status === 'success') {\n files.push(one.data.files[0]);\n } else if (one.status === 'fail') {\n failedFiles.push(one.data.files[0]);\n }\n });\n const tFiles = params.autoUpload\n ? uploadedFiles.concat(files)\n : uploadedFiles;\n const newFiles = isBatchUpload || !params.multiple ? files : tFiles;\n resolve({\n status: files.length ? 'success' : 'fail',\n data: {\n files: newFiles,\n },\n // 上传失败的文件,需等待继续上传\n failedFiles,\n list: arr,\n });\n });\n });\n}\n\nexport function formatToUploadFile(\n files: File[],\n format: FileChangeParams['format'],\n status: UploadFile['status'] = undefined,\n percent = 0,\n) {\n return files.map((fileRaw: File) => {\n let file: UploadFile = fileRaw;\n if (isFunction(format)) {\n file = format(fileRaw);\n }\n const uploadFile: UploadFile = {\n raw: fileRaw,\n lastModified: fileRaw.lastModified,\n name: fileRaw.name,\n size: fileRaw.size,\n type: fileRaw.type,\n percent,\n status,\n ...file,\n };\n return uploadFile;\n });\n}\n\nexport function validateFile(\n params: FileChangeParams\n): Promise<FileChangeReturn> {\n const { files, uploadValue, max, allowUploadDuplicateFile } = params;\n return new Promise((resolve) => {\n // 是否允许相同的文件名存在\n let tmpFiles = files.filter((file) => {\n const sameNameFile = uploadValue.find((t) => t.name === file.name);\n return allowUploadDuplicateFile || !sameNameFile;\n });\n\n let hasSameNameFile = false;\n if (tmpFiles.length < files.length) {\n hasSameNameFile = true;\n }\n if (!tmpFiles.length) {\n const tFiles = formatToUploadFile(files, params.format, params.autoUpload ? 'progress' : 'waiting');\n resolve({ hasSameNameFile, file: tFiles?.[0], files: tFiles, validateResult: { type: 'FILTER_FILE_SAME_NAME' } });\n return;\n }\n // 上传文件数量限制\n let lengthOverLimit = false;\n if (max && tmpFiles.length && !params.isBatchUpload) {\n tmpFiles = tmpFiles.slice(0, max - uploadValue.length);\n if (tmpFiles.length !== files.length) {\n lengthOverLimit = true;\n }\n }\n\n // 格式化文件对象\n const formattedFiles = formatToUploadFile(tmpFiles, params.format, params.autoUpload ? 'progress' : 'waiting');\n\n // 全量文件,一波校验,整体上传 或 终止上传\n let allFileValidatePromise;\n if (params.beforeAllFilesUpload) {\n const r = params.beforeAllFilesUpload?.(formattedFiles);\n allFileValidatePromise = r instanceof Promise ? r : new Promise((resolve) => resolve(r));\n }\n\n // 单文件合法性校验,一个文件校验不通过其他文件可继续上传\n const promiseList = formattedFiles.map((file: UploadFile) => new Promise((resolve) => {\n handleBeforeUpload(\n file,\n { beforeUpload: params.beforeUpload, sizeLimit: params.sizeLimit },\n ).then(([sizeResult, customResult]) => {\n if (sizeResult) {\n resolve({ file, validateResult: { type: 'FILE_OVER_SIZE_LIMIT', extra: sizeResult } });\n } else if (customResult === false) {\n resolve({ file, validateResult: { type: 'CUSTOM_BEFORE_UPLOAD' } });\n }\n resolve({ file });\n });\n }));\n Promise.all([allFileValidatePromise].concat(promiseList)).then((results) => {\n const [allFilesResult, ...others] = results;\n // 如果 beforeAllFilesUpload 校验未通过\n if (allFilesResult === false) {\n resolve({\n lengthOverLimit,\n hasSameNameFile,\n validateResult: { type: 'BEFORE_ALL_FILES_UPLOAD' },\n files: formattedFiles,\n });\n } else {\n resolve({\n lengthOverLimit,\n hasSameNameFile,\n fileValidateList: others,\n files: formattedFiles,\n });\n }\n });\n });\n}\n\nexport function getFilesAndErrors(fileValidateList: FileChangeReturn[], getError: (p: {[key: string]: any }) => string) {\n const sizeLimitErrors: FileChangeReturn[] = [];\n const beforeUploadErrorFiles: UploadFile[] = [];\n const toFiles: UploadFile[] = [];\n fileValidateList.forEach((oneFile) => {\n if (oneFile.validateResult?.type === 'CUSTOM_BEFORE_UPLOAD') {\n beforeUploadErrorFiles.push(oneFile.file);\n return;\n }\n if (oneFile.validateResult?.type === 'FILE_OVER_SIZE_LIMIT') {\n if (!oneFile.file.response) {\n oneFile.file.response = {};\n }\n oneFile.file.response.error = oneFile.file.response.error\n || getError(oneFile.validateResult.extra);\n sizeLimitErrors.push(oneFile);\n return;\n }\n toFiles.push(oneFile.file);\n });\n\n return { sizeLimitErrors, beforeUploadErrorFiles, toFiles };\n}\n\n/**\n * 获取文件上传触发元素文本 在全局配置中的字段\n */\nexport function getTriggerTextField(p: {\n status: 'success' | 'fail' | 'progress' | 'waiting',\n multiple: boolean,\n autoUpload: boolean;\n isBatchUpload: boolean;\n}): keyof UploadTriggerUploadText {\n if (p.isBatchUpload && p.status) return 'reupload';\n if (p.status === 'fail') return 'reupload';\n if (p.status === 'progress') return 'uploading';\n if (p.status === 'success' || (!p.autoUpload && p.status === 'waiting')) {\n return p.multiple ? 'continueUpload' : 'reupload';\n }\n return 'fileInput';\n}\n\nexport interface GetDisplayFilesParams {\n multiple: boolean;\n autoUpload: boolean;\n isBatchUpload: boolean;\n uploadValue: UploadFile[];\n toUploadFiles: UploadFile[];\n}\n\n/**\n * 获取文件列表显示\n */\nexport function getDisplayFiles(params: GetDisplayFilesParams) {\n const { multiple, uploadValue, toUploadFiles, autoUpload } = params;\n const waitingUploadFiles = autoUpload\n ? toUploadFiles\n : toUploadFiles.filter((file) => file.status !== 'success');\n if (multiple && !params.isBatchUpload) {\n if (!autoUpload) return uploadValue;\n return (waitingUploadFiles.length ? uploadValue.concat(waitingUploadFiles) : uploadValue) || [];\n }\n return (waitingUploadFiles.length ? waitingUploadFiles : uploadValue) || [];\n}\n"],"names":["isNumber","size","unit","result","isFunction","promiseList","files","res","file","currentFiles","response","event","XMLHttpRequest","log","toUploadFiles","requestMethod","resultFiles","resolve","data","onError","status","onSuccess","p","xhrReq","newFiles","failedFiles","arr","list","raw","percent","hasSameNameFile","validateResult","type","tmpFiles","lengthOverLimit","sizeResult","customResult","extra","Promise","allFilesResult","fileValidateList","beforeUploadErrorFiles","oneFile","sizeLimitErrors","toFiles"],"mappings":"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"}