New file |
| | |
| | | 'use strict'; |
| | | |
| | | 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({ |
| | | 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({ |
| | | 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({ |
| | | errMsg: ERR_MSG_FAIL + ' 请指定 type 类型,该平台仅支持选择 image 或 video。', |
| | | }); |
| | | } |
| | | chooseFile({ |
| | | type: 'all', |
| | | count, |
| | | extension, |
| | | success(res) { |
| | | resolve(normalizeChooseAndUploadFileRes(res)); |
| | | }, |
| | | fail(res) { |
| | | reject({ |
| | | 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 |
| | | let self = this |
| | | return new Promise(resolve => { |
| | | while (count < max) { |
| | | next() |
| | | } |
| | | |
| | | function next() { |
| | | let 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 |
| | | }; |