基于 vue-cropper-elementUI 截图上传插件

         

         

       

     

       

         

图片裁剪

         

       

       

         

            旋转:

           

           

            重新裁切:

           

            裁切后宽/高:

           

         

         

           

              ref="cropper"

              :img="option.img"

              :outputSize="option.outputSize"

              :outputType="option.outputType"

              :info="true" :full="option.full"

              :canMove="option.canMove"

              :canMoveBox="option.canMoveBox"

              :fixedBox="option.fixedBox"

              :original="option.original"

              :autoCrop="option.autoCrop"

              :autoCropWidth="option.autoCropWidth"

              :autoCropHeight="option.autoCropHeight"

              :centerBox="option.centerBox"

              :high="option.high"

              :infoTrue="option.infoTrue"

              :enlarge="option.enlarge"

              :maxImgSize="option.maxImgSize"

              @realTime="realTime"

              :canScale="option.canScale">

           

         

       

       

     


import { VueCropper } from 'vue-cropper'

export default {

components: { VueCropper },

data(){

return{

option: {

        img: '',

        outputSize: 1,

        outputType: 'png', // 输出图片格式

        full: true, // 是否输出原图比例的截图

        canMove: true, // 能否拖动图片

        canMoveBox: true, // 能否拖动截图框

        fixedBox: false, // 截图框固定大小

        original: true, // 上传图片是否显示原始宽高

        autoCrop: true, // 是否自动生成截图框

        autoCropWidth: 400, // 自动生成截图框宽度

        autoCropHeight: 250, // 自动生成截图框高度

        centerBox: false, // 截图框是否限制在图片里(只有在自动生成截图框时才能生效)

        high: true, // 是否根据dpr生成适合屏幕的高清图片

        infoTrue: true, // 截图信息展示是否是真实的输出宽高

        cropData: {},

        enlarge: 1, // 是否按照截图框比例输出

        mode: 'cover', // 图片默认渲染方式

        canScale: true, // 是否允许滚轮图片缩放

        maxImgSize: 40000 // 最大上传图片尺寸

      },

}

}

refreshCrop () {

      // clear

      this.$refs.cropper.refresh()

    },

    clearCrop () {

      // clear

      this.$refs.cropper.clearCrop()

    },

    changeScale (num) {

      num = num || 1

      this.$refs.cropper.changeScale(num)

    },

    rotateLeft () {

      this.$refs.cropper.rotateLeft()

    },

    rotateRight () {

      this.$refs.cropper.rotateRight()

    },

    finish (type) {

      // 输出并上传服务器

      var that = this

      that.dialogVisible = !that.dialogVisible

      if (type === 'blob') {

        this.$refs.cropper.getCropBlob(data => {

          var formData = new FormData()

          var img = window.URL.createObjectURL(data)

          this.model = true

          this.modelSrc = img

          var file = new File([data], 'img.png', { type: 'image/png' })

          formData.append('img', file)

          var axiosInstance = axios.create()

          axiosInstance.post('/M/File/PostUploadFile', formData).then((res) => {

            var param = {

              'fileName': res.data.other.imgName,

              'groupId': that.selectGroup, // 图片分组

              'filePath': res.data.other.imgUrl,

              'fileSpec': res.data.other.imgWidth + 'x' + res.data.other.imgHeight,

              'fileSize': res.data.other.imgLength,

              'fileType': res.data.other.imgType

            }

            that.$http.post('/api/BS_FileSourceMaterial/Create', param).then(function (res) {

              that.getDataList()

            })

          })

        })

      } else {

        this.$refs.cropper.getCropData((data) => {

          this.model = true

          this.modelSrc = data

        })

      }

    },

    // 实时尺寸

    realTime () {

      var previews = this.$refs.cropper.cropInfo

      this.previews = {

        width: previews.width,

        height: previews.height

      }

    },

    uploadImg (e, num) {

      // 上传图片

      var that = this

      var file = e.target.files[0]

      if (!/\.(jpg|jpeg|png|bmp|JPG|PNG)$/.test(e.target.value)) {

        that.$message.error('亲,上传图片不能为空,并且裁切只支持jpeg,jpg,png,bmp格式哦!')

        document.getElementById('uploads').value = null

        return false

      } else if (file.size / 1024 / 1024 > 1) {

        that.$message.error('上传的图片大小不能超过 1MB,请使用批量上传!')

        document.getElementById('uploads').value = null

      } else {

        that.isShowDialog()

        var reader = new FileReader()

        reader.onload = e => {

          var data

          if (typeof e.target.result === 'object') {

          // 把Array Buffer转化为blob 如果是base64不需要

            data = window.URL.createObjectURL(new Blob([e.target.result]))

          } else {

            data = e.target.result

          }

          this.option.img = data

        }

        reader.readAsArrayBuffer(file)

        document.getElementById('uploads').value = null

      }

    }

  },

}


其中你可能会碰到图片上传一次后不能再次上传同一张图片的坑,因为input在上传文件时候比较特殊,所以我们需要处理一下

document.getElementById('uploads').value = null  获取input ,在每次上传结束后把他的值清空,

你可能感兴趣的:(基于 vue-cropper-elementUI 截图上传插件)