You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
4.5 KiB
224 lines
4.5 KiB
'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 |
|
};
|
|
|