quanyawei
2023-11-30 f4991944d13b94355fb8aaf03dad7d60ca530ee9
uni_modules/uview-ui/components/u-upload/utils.js
New file
@@ -0,0 +1,151 @@
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
        }
    })
}