Skip to content

cropperjs

vue-cropperjs

js
import VueCropper from 'vue-cropperjs'

  components: {
    VueCropper,
  },
  data() {
    return {
      cropper: {
        img: null,
        aspectRatio: 1,
        preview: '.preview-item',
        guides: false,
      },
    }
  },
  // 设置图片源
  setSourceImg(file) {
    const fr = new FileReader();
    fr.onload = () => {
      this.cropper.img = fr.result;
      this.showSelectCover = false
    }
    fr.readAsDataURL(file);
  },
  // 检测选择的文件是否合适
  checkFile(file) {
    // 仅限图片
    if (file.type.indexOf('image') === -1) {
      this.errorMsg = '只能是图片'
      return false;
    }
    // 超出大小
    if (file.size > this.maxImgSize * 1024 * 1024) {
      this.errorMsg = `超出最大尺寸 ${this.maxImgSize} Mb`
      return false;
    }
    return true;
  },
  blobToFile (theBlob, fileName) {
    theBlob.lastModifiedDate = new Date()
    theBlob.name = fileName
    return theBlob
  },
  onSave() {
    this.$refs.cropper.getCroppedCanvas({ width: 180 }).toBlob(blobData => {
      const blob = blobData
      const newFile = this.blobToFile(blob, 'upload.png')
      const formData = new FormData()
      formData.append('file', newFile, newFile.name)
      api.uploadImage(formData).then(res => {
        const { code, data } = res.data
        if (code === 0) {
          api.updateAvatar(data, this.userType).then(resp => {
            if (resp.data.code === 0) {
              this.$message.success('保存成功')
              this.reset()
              return
            }
            this.$message.error('保存错误,请稍后再试')
          })
          this.$emit('onDone', data)
          return
        }
        console.warn(data)
      })
    })
  },
  rotate(degree) {
    this.$refs.cropper.rotate(degree)
  }
pug
    .crop-wrap(:class="{ 'when-crop': !showSelectCover }")
        .select-cover(
            v-if="showSelectCover"
            @dragleave="preventDefault"
            @dragover="preventDefault"
            @dragenter="preventDefault"
            @click="handleClick"
            @drop="handleChange"
        )
            .select-inner
                // img(src="@/assets/select-cover.jpg")
                .icon.icon-upload
                .text 拖动图片到虚框内上传
                .sub-text 仅支持 JPG、PNG 图片,文件小于4M
                label.ajz-btn(for="file-upload") 选择图片
                input(type='file', id="file-upload" v-show='false', @change='handleChange', accept="image/png, image/jpeg")
        .crop-wrap-inner(v-else)
            vue-cropper(
                ref="cropper"
                :src="cropper.img"
                :aspectRatio="cropper.aspectRatio"
                :preview="cropper.preview"
                :guides="cropper.guides"
                :img-style="{ 'width': '290px', 'height': '290px' }"
            )