Vue+ElementUI图片上传前进行图片压缩

图片上传使用的是ElementUI的Upload上传组件,参数说明请查看官网

页面使用组件

<el-upload
	:action="upload_path" 
	list-type="picture-card"
	:data="upload_info"
	name="file"
	:on-success="uploadSuccess"
	:on-preview="handlePictureCardPreview"
	:on-remove="handleRemove"
	:before-upload="beforeAvatarUpload"
	:file-list="imgs"
	:show-file-list="true"
	accept="image/*">
		<i class="el-icon-plus" />
</el-upload>

 

参数定义

data() {
	return {
		imgs: [],
		// 图片预览
		dialogImageUrl: '',
		dialogVisible: false,
		upload_path: '图片上传api接口',
		// 上传时附带的额外参数
		upload_info: {
			type: 'img',
			data: '上传时附带的额外参数'
		},
		quality: 0.6, // 压缩比例
	}
},

 

Upload组件调用的方法:

methods: {
	// 文件上传成功
    uploadSuccess(res) {
      if (res.code === 200) {
        this.imgs.push({ name: res.data, url: this.$fileUrl_ + '/' + res.data, path: res.data })
      } else {
        console.error('文件上传失败', res.msg)
      }
    },
	// 上传文件之前
    beforeAvatarUpload(file) {
		// 图片大小大于2M进行图片压缩
      if (file.size / 1024 / 1024 > 2) {
        const that = this
        return new Promise(resolve => {
          const reader = new FileReader()
          const image = new Image()
          image.onload = (imageEvent) => {
            const canvas = document.createElement('canvas') // 创建画布
            const context = canvas.getContext('2d') 		// 画布为2d
            const width = image.width * that.quality 		// 图片宽度 * 压缩比例
            const height = image.height * that.quality		// 图片高度 * 压缩比例
            canvas.width = width							// 画布宽度
            canvas.height = height							// 画布宽度
            context.clearRect(0, 0, width, height)
            context.drawImage(image, 0, 0, width, height)
            const dataUrl = canvas.toDataURL(file.type)		//图片转路径
            const blobData = that.dataURLtoBlob(dataUrl, file.type) //图片转二进制
            resolve(blobData)
          }
          reader.onload = e => { image.src = e.target.result }
          reader.readAsDataURL(file)
        })
      } else {
        return true
      }
    },
	//图片转二进制
    dataURLtoBlob(dataURL, type) {
      var binary = atob(dataURI.split(',')[1])
      var array = []
      for (var i = 0; i < binary.length; i++) {
        array.push(binary.charCodeAt(i))
      }
      return new Blob([new Uint8Array(array)], { type: type })
    },
	// 图片移除
    handleRemove(file, fileList) {
      const arr = []
      fileList.forEach(r => {
        arr.push(r.response.data)
      })
      this.imgs = arr
    },
	// 图片预览
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url
      this.dialogVisible = true
    },
}

 

转载:Vue+Element-UI实现上传图片并压缩

 

posted @ 2022-05-10 11:37  编程民工  阅读(817)  评论(0编辑  收藏  举报