mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-11-04 08:06:12 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			152 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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
 | 
						||
        }
 | 
						||
    })
 | 
						||
}
 |