UNPKG

asp-smart-ui-plus-test

Version:

A Component Library for Vue 3

205 lines (194 loc) 5.77 kB
'use strict' /* global uni uniCloud wx */ const ERR_MSG_OK = 'chooseAndUploadFile:ok' const ERR_MSG_FAIL = 'chooseAndUploadFile:fail' function chooseImage (opts) { const { count, sizeType = ['original', 'compressed'], sourceType = ['album', 'camera'], extension } = opts return new Promise((resolve, reject) => { uni.chooseImage({ count, sizeType, sourceType, extension, success (res) { resolve(normalizeChooseAndUploadFileRes(res, 'image')) }, fail (res) { reject(new Error({ message: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL), errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL) })) } }) }) } function chooseVideo (opts) { const { camera, compressed, maxDuration, sourceType = ['album', 'camera'], extension } = opts return new Promise((resolve, reject) => { uni.chooseVideo({ camera, compressed, maxDuration, sourceType, extension, success (res) { const { tempFilePath, duration, size, height, width } = res resolve( normalizeChooseAndUploadFileRes( { errMsg: 'chooseVideo:ok', tempFilePaths: [tempFilePath], tempFiles: [ { name: (res.tempFile && res.tempFile.name) || '', path: tempFilePath, size, type: (res.tempFile && res.tempFile.type) || '', width, height, duration, fileType: 'video', cloudPath: '' } ] }, 'video' ) ) }, fail (res) { reject(new Error({ message: res.errMsg.replace('chooseVideo:fail', ERR_MSG_FAIL), errMsg: res.errMsg.replace('chooseVideo:fail', ERR_MSG_FAIL) })) } }) }) } function chooseAll (opts) { const { count, extension } = opts return new Promise((resolve, reject) => { let chooseFile = uni.chooseFile if (typeof wx !== 'undefined' && typeof wx.chooseMessageFile === 'function') { chooseFile = wx.chooseMessageFile } if (typeof chooseFile !== 'function') { return reject(new Error({ message: ERR_MSG_FAIL + ' 请指定 type 类型,该平台仅支持选择 image 或 video。', errMsg: ERR_MSG_FAIL + ' 请指定 type 类型,该平台仅支持选择 image 或 video。' })) } chooseFile({ type: 'all', count, extension, success (res) { resolve(normalizeChooseAndUploadFileRes(res)) }, fail (res) { return reject(new Error({ message: res.errMsg.replace('chooseFile:fail', ERR_MSG_FAIL), errMsg: res.errMsg.replace('chooseFile:fail', ERR_MSG_FAIL) })) } }) }) } function normalizeChooseAndUploadFileRes (res, fileType) { res.tempFiles.forEach((item, index) => { if (!item.name) { item.name = item.path.substring(item.path.lastIndexOf('/') + 1) } if (fileType) { item.fileType = fileType } item.cloudPath = Date.now() + '_' + index + item.name.substring(item.name.lastIndexOf('.')) }) if (!res.tempFilePaths) { res.tempFilePaths = res.tempFiles.map(file => file.path) } return res } function uploadCloudFiles (files, max = 5, onUploadProgress) { files = JSON.parse(JSON.stringify(files)) const len = files.length let count = 0 const self = this return new Promise(resolve => { while (count < max) { next() } function next () { const cur = count++ if (cur >= len) { !files.find(item => !item.url && !item.errMsg) && resolve(files) return } const fileItem = files[cur] const index = self.files.findIndex(v => v.uuid === fileItem.uuid) fileItem.url = '' delete fileItem.errMsg uniCloud .uploadFile({ filePath: fileItem.path, cloudPath: fileItem.cloudPath, fileType: fileItem.fileType, onUploadProgress: res => { res.index = index onUploadProgress && onUploadProgress(res) } }) .then(res => { fileItem.url = res.fileID fileItem.index = index if (cur < len) { next() } }) .catch(res => { fileItem.errMsg = res.errMsg || res.message fileItem.index = index if (cur < len) { next() } }) } }) } function uploadFiles (choosePromise, { onChooseFile, onUploadProgress }) { return choosePromise .then(res => { if (onChooseFile) { const customChooseRes = onChooseFile(res) if (typeof customChooseRes !== 'undefined') { return Promise.resolve(customChooseRes).then(chooseRes => typeof chooseRes === 'undefined' ? res : chooseRes ) } } return res }) .then(res => { if (res === false) { return { errMsg: ERR_MSG_OK, tempFilePaths: [], tempFiles: [] } } return res }) } function chooseAndUploadFile ( opts = { type: 'all' } ) { if (opts.type === 'image') { return uploadFiles(chooseImage(opts), opts) } else if (opts.type === 'video') { return uploadFiles(chooseVideo(opts), opts) } return uploadFiles(chooseAll(opts), opts) } export { chooseAndUploadFile, uploadCloudFiles }