h5相机功能
h5相机功能
利用vant + input file
import { ref, getCurrentInstance, reactive, onMounted, defineExpose } from 'vue' import { Action, InfoInterface } from './config' import { fileUpload } from '@/utils/fileHttp' const emit = defineEmits(['chooseFIle']) /** * @description: 传参 * @return {*} * @Date Changed: */ interface Props { // 文件list fileList: string | null | any[] // 上传数量 maxCount?: number //尺寸 这个暂时没用 maxSize?: number // 缩略图大小 px 和 rem disabled?: boolean // 图片类型 accept?: string[] type?: number[] // 是否全部允许 allowAllAccept?: boolean isRequire?: boolean // } const props = withDefaults(defineProps(), { fileList: () => [], maxCount: 1, maxSize: 5 * 1024 * 1024, disabled: false, accept: () => ['image'], type: () => [0], allowAllAccept: false, isRequire: false }) /** * @description: 通用参数 * @return {*} * @Date Changed: */ const { proxy }: any = getCurrentInstance() const router = proxy.commond.router() const route = proxy.commond.route() const { Toast } = proxy.commond const info = reactive({ imgList: [], actions: [] // aaaaaa: [] }) let toastLoading: any = null const token = proxy.commond.getToken() /** * @description: 生命周期 * @return {*} * @Date Changed: */ onMounted(() => { init() }) const init = () => { // 拍照模式 const arr: Action[] = [] props.type.forEach((item: number) => { arr.push(list[item]) }) info.actions = arr } //----------------------------------------------------------- 底部弹出选择拍照模式 const showChoose = ref(false) const list: Action[] = [ { name: '拍照', type: 'ShowView', value: 'CameraView' }, { name: '相册', type: 'ShowView', value: 'PhotoView' }, { name: '文件上传', type: 'uploadFile', value: 'fileView' } ] const clickUpload = () => { showChoose.value = true } const onCancel = () => { showChoose.value = false } const selectAction = async (action: Action, index: number) => { if (action.value === 'CameraView') { // 拍照 console.log(proxy.$refs.camera) proxy.$refs.camera.click() showChoose.value = false } // if (res.length > 0) { // const arr = proxy.commond.deepClone(info.imgList) // res.map((ele) => { // arr.push(`OSS_FILE_${ele.resourcesId}/${ele.fullFileName}`) // }) // emit('success', arr) // showChoose.value = false // } } /** * @description: 上传文件 * @return {*} */ const uploadImg = (e: any) => { // 这里可以做一些限制 比如 文件大小 文件类型等 // ---------- const file = e.target.files[0] // 原生请求 toastLoading = proxy.commond.Toast.loading({ duration: 0, forbidClick: true, message: '开始上传...' }) fileUpload(file) .then((data: any) => { const url = `OSS_FILE_${data.result.resourcesId}/${data.result.fullFileName}` info.imgList.push(url) emit('chooseFIle', info.imgList, file) toastLoading.clear() proxy.$refs.camera.value = '' }) .catch((err) => { toastLoading.clear() proxy.commond.Toast(err.message) proxy.$refs.camera.value = '' }) } const doFileUrl = (resourcesId: string): string => { return proxy.commond.doFileUrl(resourcesId) } /** * @description: 删除照片 * @param {*} val * @param {*} index * @return {*} */ const deleteImg = (val: string, index: number) => { info.imgList.splice(index, 1) emit('chooseFIle', info.imgList, '') } /** * @description: 图片预览 * @param {*} val * @param {*} index * @return {*} */ const preview = (val: string, index: number) => { const arr: string[] = [] info.imgList.forEach((ele) => { arr.push(doFileUrl(ele)) }) proxy.commond.ImagePreview({ images: arr, startPosition: index }) } defineExpose({ selectAction, preview }) .cameraInput { position: absolute; left: 0; right: 0; bottom: 0; top: 0; display: none; } .btnUpload { position: relative; text-align: center; background-color: #fbfdff; border: 1px dashed #c0ccda; border-radius: 6px; box-sizing: border-box; display: inline-block; width: 148px; height: 148px; cursor: pointer; line-height: 146px; vertical-align: top; } .imgItem { display: inline-block; position: relative; border: 1px dashed #c0ccda; width: 148px; height: 148px; cursor: pointer; img { margin-top: 4px; width: 140px; height: 140px; } .close { position: absolute; right: -14px; top: -10px; background: #fff; border-radius: 100px; color: $danger; } }
/**
* @description: 上传文件景天参数
* @return {*}
* @Date Changed:
*/
export interface Action {
name: string
type: string
value: string
}
/**
* @description:图片返回值处理
* @return {*}
* @Date Changed:
*/
export interface ImgFace {
resourcesId: string
resourceUrl: string
fullFileName: string
fileName: string
id: string
}
/**
* @descriptioninfo
* @return {*}
* @Date Changed:
*/
export interface InfoInterface {
imgList: string[]
actions: Action[]
}
export interface fileBox {
show: boolean
url: string
}
使用
// 调用相机
const face = ref(null)
face.value.selectAction({ value: 'CameraView' })
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
