'use strict';
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
const ERR_MSG_OK = 'chooseAndUploadFile:ok';
|
const ERR_MSG_FAIL = 'chooseAndUploadFile:fail';
|
function chooseImage(opts) {
|
const { count, sizeType, sourceType, 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, 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('.'));
|
});
|
// wx.chooseMessageFile
|
if (!res.tempFilePaths) {
|
res.tempFilePaths = res.tempFiles.map((file) => file.path);
|
}
|
return res;
|
}
|
function uploadCloudFiles(res, max = 5, onUploadProgress) {
|
res = Object.assign({}, res);
|
res.errMsg = ERR_MSG_OK;
|
const files = res.tempFiles;
|
const len = files.length;
|
let count = 0;
|
return new Promise((resolve) => {
|
while (count < max) {
|
next();
|
}
|
function next() {
|
let cur = count++;
|
if (cur >= len) {
|
!files.find((item) => !item.url && !item.errMsg) && resolve(res);
|
return;
|
}
|
const fileItem = files[cur];
|
uniCloud
|
.uploadFile({
|
filePath: fileItem.path,
|
cloudPath: fileItem.cloudPath,
|
fileType: fileItem.fileType,
|
onUploadProgress(res) {
|
res.index = cur;
|
res.tempFile = fileItem;
|
res.tempFilePath = fileItem.path;
|
onUploadProgress &&
|
onUploadProgress(res);
|
},
|
})
|
.then((res) => {
|
fileItem.url = res.fileID;
|
if (cur < len) {
|
next();
|
}
|
})
|
.catch((res) => {
|
// fileItem.errMsg = res.message;
|
fileItem.errMsg = res.errMsg || res.message;
|
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 uploadCloudFiles(res, 5, onUploadProgress);
|
});
|
}
|
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);
|
}
|
|
exports.chooseAndUploadFile = chooseAndUploadFile;
|