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.
79 lines
1.8 KiB
79 lines
1.8 KiB
import { fileToUrl } from 'uni-platform/helpers/file'
|
|
import { updateElementStyle } from 'uni-shared'
|
|
|
|
const {
|
|
invokeCallbackHandler: invoke
|
|
} = UniServiceJSBridge
|
|
|
|
let imageInput = null
|
|
|
|
const _createInput = function (options) {
|
|
const inputEl = document.createElement('input')
|
|
inputEl.type = 'file'
|
|
updateElementStyle(inputEl, {
|
|
position: 'absolute',
|
|
visibility: 'hidden',
|
|
'z-index': -999,
|
|
width: 0,
|
|
height: 0,
|
|
top: 0,
|
|
left: 0
|
|
})
|
|
inputEl.accept = 'image/*'
|
|
if (options.count > 1) {
|
|
inputEl.multiple = 'multiple'
|
|
}
|
|
// 经过测试,仅能限制只通过相机拍摄,不能限制只允许从相册选择。
|
|
if (options.sourceType.length === 1 && options.sourceType[0] === 'camera') {
|
|
inputEl.capture = 'camera'
|
|
}
|
|
|
|
return inputEl
|
|
}
|
|
|
|
export function chooseImage ({
|
|
count,
|
|
// sizeType,
|
|
sourceType
|
|
}, callbackId) {
|
|
// TODO handle sizeType 尝试通过 canvas 压缩
|
|
|
|
if (imageInput) {
|
|
document.body.removeChild(imageInput)
|
|
imageInput = null
|
|
}
|
|
|
|
imageInput = _createInput({
|
|
count: count,
|
|
sourceType: sourceType
|
|
})
|
|
document.body.appendChild(imageInput)
|
|
|
|
imageInput.addEventListener('change', function (event) {
|
|
const tempFiles = []
|
|
const fileCount = event.target.files.length
|
|
for (let i = 0; i < fileCount; i++) {
|
|
const file = event.target.files[i]
|
|
let filePath
|
|
Object.defineProperty(file, 'path', {
|
|
get () {
|
|
filePath = filePath || fileToUrl(file)
|
|
return filePath
|
|
}
|
|
})
|
|
tempFiles.push(file)
|
|
}
|
|
const res = {
|
|
errMsg: 'chooseImage:ok',
|
|
get tempFilePaths () {
|
|
return tempFiles.map(({ path }) => path)
|
|
},
|
|
tempFiles: tempFiles
|
|
}
|
|
invoke(callbackId, res)
|
|
|
|
// TODO 用户取消选择时,触发 fail,目前尚未找到合适的方法。
|
|
})
|
|
|
|
imageInput.click()
|
|
}
|
|
|