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.
151 lines
4.0 KiB
151 lines
4.0 KiB
function pickExclude(obj, keys) { |
|
// 某些情况下,type可能会为 |
|
if (!['[object Object]', '[object File]'].includes(Object.prototype.toString.call(obj))) { |
|
return {} |
|
} |
|
return Object.keys(obj).reduce((prev, key) => { |
|
if (!keys.includes(key)) { |
|
prev[key] = obj[key] |
|
} |
|
return prev |
|
}, {}) |
|
} |
|
|
|
function formatImage(res) { |
|
return res.tempFiles.map((item) => ({ |
|
...pickExclude(item, ['path']), |
|
type: 'image', |
|
url: item.path, |
|
thumb: item.path, |
|
size: item.size, |
|
// #ifdef H5 |
|
name: item.name |
|
// #endif |
|
})) |
|
} |
|
|
|
function formatVideo(res) { |
|
return [ |
|
{ |
|
...pickExclude(res, ['tempFilePath', 'thumbTempFilePath', 'errMsg']), |
|
type: 'video', |
|
url: res.tempFilePath, |
|
thumb: res.thumbTempFilePath, |
|
size: res.size, |
|
// #ifdef H5 |
|
name: res.name |
|
// #endif |
|
} |
|
] |
|
} |
|
|
|
function formatMedia(res) { |
|
return res.tempFiles.map((item) => ({ |
|
...pickExclude(item, ['fileType', 'thumbTempFilePath', 'tempFilePath']), |
|
type: res.type, |
|
url: item.tempFilePath, |
|
thumb: res.type === 'video' ? item.thumbTempFilePath : item.tempFilePath, |
|
size: item.size |
|
})) |
|
} |
|
|
|
function formatFile(res) { |
|
return res.tempFiles.map((item) => ({ |
|
...pickExclude(item, ['path']), |
|
url: item.path, |
|
size:item.size, |
|
// #ifdef H5 |
|
name: item.name, |
|
type: item.type |
|
// #endif |
|
})) |
|
} |
|
export function chooseFile({ |
|
accept, |
|
multiple, |
|
capture, |
|
compressed, |
|
maxDuration, |
|
sizeType, |
|
camera, |
|
maxCount |
|
}) { |
|
return new Promise((resolve, reject) => { |
|
switch (accept) { |
|
case 'image': |
|
uni.chooseImage({ |
|
count: multiple ? Math.min(maxCount, 9) : 1, |
|
sourceType: capture, |
|
sizeType, |
|
success: (res) => resolve(formatImage(res)), |
|
fail: reject |
|
}) |
|
break |
|
// #ifdef MP-WEIXIN |
|
// 只有微信小程序才支持chooseMedia接口 |
|
case 'media': |
|
wx.chooseMedia({ |
|
count: multiple ? Math.min(maxCount, 9) : 1, |
|
sourceType: capture, |
|
maxDuration, |
|
sizeType, |
|
camera, |
|
success: (res) => resolve(formatMedia(res)), |
|
fail: reject |
|
}) |
|
break |
|
// #endif |
|
case 'video': |
|
uni.chooseVideo({ |
|
sourceType: capture, |
|
compressed, |
|
maxDuration, |
|
camera, |
|
success: (res) => resolve(formatVideo(res)), |
|
fail: reject |
|
}) |
|
break |
|
// #ifdef MP-WEIXIN || H5 |
|
// 只有微信小程序才支持chooseMessageFile接口 |
|
case 'file': |
|
// #ifdef MP-WEIXIN |
|
wx.chooseMessageFile({ |
|
count: multiple ? maxCount : 1, |
|
type: accept, |
|
success: (res) => resolve(formatFile(res)), |
|
fail: reject |
|
}) |
|
// #endif |
|
// #ifdef H5 |
|
// 需要hx2.9.9以上才支持uni.chooseFile |
|
uni.chooseFile({ |
|
count: multiple ? maxCount : 1, |
|
type: accept, |
|
success: (res) => resolve(formatFile(res)), |
|
fail: reject |
|
}) |
|
// #endif |
|
break |
|
// #endif |
|
default: |
|
// 此为保底选项,在accept不为上面任意一项的时候选取全部文件 |
|
// #ifdef MP-WEIXIN |
|
wx.chooseMessageFile({ |
|
count: multiple ? maxCount : 1, |
|
type: 'all', |
|
success: (res) => resolve(formatFile(res)), |
|
fail: reject |
|
}) |
|
// #endif |
|
// #ifdef H5 |
|
// 需要hx2.9.9以上才支持uni.chooseFile |
|
uni.chooseFile({ |
|
count: multiple ? maxCount : 1, |
|
type: 'all', |
|
success: (res) => resolve(formatFile(res)), |
|
fail: reject |
|
}) |
|
// #endif |
|
} |
|
}) |
|
}
|
|
|