288 lines
5.9 KiB
JavaScript
288 lines
5.9 KiB
JavaScript
'use strict';
|
||
|
||
const ERR_MSG_OK = 'chooseAndUploadFile:ok';
|
||
const ERR_MSG_FAIL = 'chooseAndUploadFile:fail';
|
||
|
||
function chooseImage(opts) {
|
||
const {
|
||
count,
|
||
sizeType = ['original', 'compressed'],
|
||
sourceType,
|
||
extension
|
||
} = opts
|
||
return new Promise((resolve, reject) => {
|
||
// 微信由于旧接口不再维护,针对微信小程序平台改用chooseMedia接口
|
||
// #ifdef MP-WEIXIN
|
||
uni.chooseMedia({
|
||
count,
|
||
sizeType,
|
||
sourceType,
|
||
mediaType: ['image'],
|
||
extension,
|
||
success(res) {
|
||
res.tempFiles.forEach(item => {
|
||
item.path = item.tempFilePath;
|
||
})
|
||
resolve(normalizeChooseAndUploadFileRes(res, 'image'));
|
||
},
|
||
fail(res) {
|
||
reject({
|
||
errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL),
|
||
});
|
||
},
|
||
})
|
||
// #endif
|
||
// #ifndef MP-WEIXIN
|
||
uni.chooseImage({
|
||
count,
|
||
sizeType,
|
||
sourceType,
|
||
extension,
|
||
success(res) {
|
||
resolve(normalizeChooseAndUploadFileRes(res, 'image'));
|
||
},
|
||
fail(res) {
|
||
reject({
|
||
errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL),
|
||
});
|
||
},
|
||
});
|
||
// #endif
|
||
|
||
});
|
||
}
|
||
|
||
function chooseVideo(opts) {
|
||
const {
|
||
count,
|
||
camera,
|
||
compressed,
|
||
maxDuration,
|
||
sourceType,
|
||
extension
|
||
} = opts;
|
||
return new Promise((resolve, reject) => {
|
||
// 微信由于旧接口不再维护,针对微信小程序平台改用chooseMedia接口
|
||
// #ifdef MP-WEIXIN
|
||
uni.chooseMedia({
|
||
count,
|
||
compressed,
|
||
maxDuration,
|
||
sourceType,
|
||
extension,
|
||
mediaType: ['video'],
|
||
success(res) {
|
||
const {
|
||
tempFiles,
|
||
} = res;
|
||
resolve(normalizeChooseAndUploadFileRes({
|
||
errMsg: 'chooseVideo:ok',
|
||
tempFiles: tempFiles.map(item => {
|
||
return {
|
||
name: item.name || '',
|
||
path: item.tempFilePath,
|
||
thumbTempFilePath: item.thumbTempFilePath,
|
||
size:item.size,
|
||
type: (res.tempFile && res.tempFile.type) || '',
|
||
width:item.width,
|
||
height:item.height,
|
||
duration:item.duration,
|
||
fileType: 'video',
|
||
cloudPath: '',
|
||
}
|
||
}),
|
||
}, 'video'));
|
||
},
|
||
fail(res) {
|
||
reject({
|
||
errMsg: res.errMsg.replace('chooseVideo:fail', ERR_MSG_FAIL),
|
||
});
|
||
},
|
||
})
|
||
// #endif
|
||
// #ifndef MP-WEIXIN
|
||
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),
|
||
});
|
||
},
|
||
});
|
||
// #endif
|
||
});
|
||
}
|
||
|
||
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
|
||
};
|