组件上传图片的的时候调用手机摄像头进行拍照

390 阅读1分钟

组件上传图片的的时候调用手机摄像头进行拍照,demo记录

import { CommonService } from '@/api' 这个引用是调用上传的组件接口,建议上传组件使用雪花算法进行一个上传数据和列表数据的绑定

<template>
  <div class="s-uploader" style="margin-top: 50px">
    <div class="s-uploader-wrapper" @click="openCamera">
      <div class="s-uploader-upload">
        <van-icon color="#dcdee0" name="photograph" size="24" />
      </div>
    </div>

    <div class="s-uploader-wrapper" @click="openPhotoLibrary">
      <div class="s-uploader-upload">
        <van-icon color="#dcdee0" name="photograph" size="24" />
      </div>
    </div>
  </div>
</template>

<script>
import { CommonService } from '@/api'

// Resolve fileLocalUrl to File object
const resolveFile = fileURL => {
  return new Promise(resolve => {
    window.resolveLocalFileSystemURL(fileURL, fileEntry => {
      fileEntry.file(resolve)
    })
  })
}

// Read File's Blob
const readFile = file => {
  return new Promise((resolve, reject) => {
    const reader = new FileReader()

    reader.onloadend = ev => {
      if (ev.target.error) {
        return reject(ev.target.error)
      }
      return resolve(new Blob([new Uint8Array(reader.result)]))
    }
    reader.onerror = reject
    reader.readAsArrayBuffer(file)
  })
}

export default {
  name: 'CordovaPluginCamera',

  methods: {
    // 调用拍照
    openCamera() {
      // 拍照参数
      const options = {
        // 图像的保存质量,范围 0-100
        quality: 80,
        // 返回 FILE_URI 类型
        destinationType: Camera.DestinationType.FILE_URI,
        // 指定图片来自拍照
        sourceType: Camera.PictureSourceType.CAMERA
      }

      navigator.camera.getPicture(this.onSuccess, this.onError, options)
    },

    // 调用相册
    openPhotoLibrary() {
      // 相册参数
      const options = {
        quality: 80,
        // 返回 FILE_URI 类型
        destinationType: Camera.DestinationType.FILE_URI,
        // 指定图片来自相册
        sourceType: Camera.PictureSourceType.PHOTOLIBRARY
      }

      navigator.camera.getPicture(this.onSuccess, this.onError, options)
    },

    //调取成功触发事件
    async onSuccess(imageURL) {
      console.log(imageURL)

      const file = await resolveFile(imageURL)
      const blob = await readFile(file)

      this.uploadFile(blob)
    },

    //调取失败触发事件
    onError(message) {
      console.log('message', message)
    },

    // 上传图片
    async uploadFile(blob) {
      const data = new FormData()
      data.append('file', blob)
      console.log(blob)

      const result = await CommonService.uploadPicFile(data)
      console.log(result)
    }
  }
}
</script>

<style lang="less" scoped>
.s-uploader {
  width: 100%;
  height: 100vh;
  background-color: #fff !important;
}

.s-uploader-upload {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 80px;
  height: 80px;
  margin: 0 8px 8px 0;
  background-color: #f7f8fa;
}
</style>