【Vue】VueCropper裁剪图片后上传至OSS

第一步:选择图片时,现先获取上传图片

// 获取文件
    getFile (event) {
      let imgTarget = event.target.files[0]
      if (!imgTarget) {
        return
      }
      let type = imgTarget.type // 文件的类型,判断是否是图片
      let size = imgTarget.size // 文件的大小,判断图片的大小

      if (this.imgData.accept.indexOf(type) === -1) {
        this.$Message.warning('格式不支持')
        return false
      }
      if (size > 1024 * 1024 * 5) {
        this.$Message.warning('请选择5M以内的图片')
        return false
      }
      // 获取上传的图片base-64格式
      this.getBase64(imgTarget).then(res => {
        this.dialogVisible = true
        this.cropperImgUrl = res
        // 创建对象
        let imgObj = new Image()
        // 改变图片地址
        imgObj.src = res
        let that = this
        imgObj.onload = function () {
          let width = imgObj.width
          // 使得裁剪框撑满图片宽度
          that.option.autoCropWidth = width
        }
      })
    },

第二步:图片转化base-64格式图片,

// base-64格式转换方法
    getBase64 (file) {
      return new Promise(function (resolve, reject) {
        let reader = new FileReader()
        let imgResult = ''
        reader.readAsDataURL(file)
        reader.onload = function () {
          imgResult = reader.result
        }
        reader.onerror = function (error) {
          reject(error)
        }
        reader.onloadend = function () {
          resolve(imgResult)
        }
      })
    },

第三步:获取裁剪的blob数据,

uploadImg () {
      // 上传裁剪后的图片
      this.$refs.cropper.getCropBlob(data => {
        // 获取截图的blob数据
        // console.log(data);
        let aTime = new Date().getTime() // 取时间戳,给文件命名
        let fileName = aTime + '.' + data.type.substr(6) // 给文件名加后缀
        let file = new window.File([data], fileName, { type: data.type }) // blob转file
        this.upLoad(file) // 上传操作
      })
    },

第四步:上传至OSS,

async upLoad (file) {
      // 上传
      let OSS = require('ali-oss')
      let client = new OSS({
        region: config.region,
        accessKeyId: config.accessKeyId,
        accessKeySecret: config.accessKeySecret,
        bucket: config.bucket
      })
      let path = this.getUploadPath() + file.name
      await client.put(path, file)
        .then(result => {
          let region = process.env.NODE_ENV === 'production' ? 'service-center-image.oss-cn-shanghai.aliyuncs.com' : 'service-center.oss-cn-qingdao.aliyuncs.com'
          let domain = process.env.NODE_ENV === 'production' ? 'image.laodao.so' : 'image.test.laodao.so'
          const url = result.url.replace(region, domain)
          this.dialogVisible = false // 关闭裁剪框
          this.$emit('uploadSuccess', url)
          this.$Message.success('上传成功!')
        })
        .catch(err => {
          console.log(err)
          this.$Message.error('上传失败' + err.message)
        })
    },

在做项目的时候,其中有几个彩蛋:

1.获取图片的宽高,设置裁剪框为最大宽度,默认裁剪框为图片的80%,

        // 创建对象
        let imgObj = new Image()
        // 改变图片地址
        imgObj.src = res
        let that = this
        imgObj.onload = function () {
          let width = imgObj.width
          // 使得裁剪框撑满图片宽度
          that.option.autoCropWidth = width
        }

2.file input 选择相同文件不触发change事件,

onCancel () {
      this.dialogVisible = false
      this.$refs.input.value = null // 选择相同图片时 change不再触发
    }

完整demo:




 

你可能感兴趣的:(vuejs)