Bootstrap

vue2压缩图片上传

<el-upload
  class="upload-demo"
  action
  :http-request="handleUploadForm"
  :on-change="imgSaveToUrl"
  :headers="myHeaders"
  :show-file-list="false"
  multiple
>
<el-button
  icon="el-icon-upload2"
  size="small"
  class="mr15"
  v-if="!pictureType"
></el-button>
<template #trigger></template>
</el-upload>

data() {
  myHeaders: { "X-Token": getToken() },
}

 // 选取图片后自动回调,里面可以获取到文件
    imgSaveToUrl(event) {
      // 也可以用file
      this.localFile = event.raw // 或者 this.localFile=file.raw

      // 转换操作可以不放到这个函数里面,
      // 因为这个函数会被多次触发,上传时触发,上传成功也触发
      let reader = new FileReader()
      reader.readAsDataURL(this.localFile) // 这里也可以直接写参数event.raw

      // 转换成功后的操作,reader.result即为转换后的DataURL ,
      // 它不需要自己定义,你可以console.integralLog(reader.result)看一下
      reader.onload = () => {
        // console.integralLog(reader.result)
      }

      /* 另外一种本地预览方法 */
      let URL = window.URL || window.webkitURL
      this.localImg = URL.createObjectURL(event.raw)
    },

// 上传
handleUploadForm(param) {
  // 压缩图片并上传
  this.compressImage(this.localFile, (compressedFile) => {
    const formData = new FormData()
    const data = {
      model: this.modelName
        ? this.modelName
        : this.$route.path.split("/")[1],
      pid: this.tableData.pid
    }
    formData.append("multipart", compressedFile)
    let loading = this.$loading({
      lock: true,
      text: "上传中,请稍候...",
      spinner: "el-icon-loading",
      background: "rgba(0, 0, 0, 0.7)"
    })
    fileImageApi(formData, data)
      .then((res) => {
        loading.close()
        this.$message.success("上传成功")
        this.tableData.page = 1
        this.getFileList()
      })
      .catch((res) => {
        loading.close()
      })
  })
},

主要是这个代码

  compressImage(file, callback) {
      const reader = new FileReader()
      reader.readAsDataURL(file)
      reader.onload = (e) => {
        const img = new Image()
        img.src = e.target.result
        img.onload = () => {
          const canvas = document.createElement("canvas")
          const ctx = canvas.getContext("2d")

          // 设置压缩后的宽度和高度
          const maxWidth = 800 // 最大宽度
          const maxHeight = 800 // 最大高度
          let width = img.width
          let height = img.height

          if (width > maxWidth || height > maxHeight) {
            if (width / height > maxWidth / maxHeight) {
              width = maxWidth
              height = Math.round(maxWidth * (img.height / img.width))
            } else {
              height = maxHeight
              width = Math.round(maxHeight * (img.width / img.height))
            }
          }

          canvas.width = width
          canvas.height = height

          // 绘制压缩后的图片
          ctx.drawImage(img, 0, 0, width, height)

          // 转换为 Blob
          canvas.toBlob(
            (blob) => {
              const compressedFile = new File([blob], file.name, {
                type: file.type
              })
              callback(compressedFile) // 返回压缩后的文件
            },
            file.type,
            0.7 // 压缩质量(0~1,值越低压缩率越高)
          )
        }
      }
    },

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;