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.
186 lines
5.9 KiB
186 lines
5.9 KiB
'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;
|
|
|