Vant上传图片压缩

Vant上传图片压缩

代码如下:

<van-uploader v-model="fileList" multiple :after-read="afterRead" max-count="1">
     <button type="button"><span>+</span> 上传文件</button>
</van-uploader>
   afterRead(file) {
      if (!file.file) {
        return;
      }
      // 此时可以自行将文件上传至服务器
      file.status = "uploading";
      file.message = "上传中...";
      let maxSize = 1 * 1024 * 1024; //自己定义的文件大小,超过多少M就开始压缩(现在是1M)
      let fileObj = file.file; // 当前的图片
      if (fileObj.size > maxSize) {
        this.imgcompress(fileObj, file);
      } else {
        const formData = new FormData();
        formData.append("file[]", file.file); //此处的文件上传是formData格式
        formData.append("private", 0);
        let dirName = "voucher_img";
        formData.append("dir", dirName);
        console.log(file.file);
        
        upload(formData)
          .then((res) => {
            this.rechargeFile = res.data.data;
            file.status = "";
            file.message = "";
          })
          .catch((err) => {
            file.status = "failed";
            file.message = "上传失败";
          });
      }
    },

    imgcompress(file, files) {
      const img = document.createElement("img");
      const reader = new FileReader(); // 读取文件资源实例
      reader.readAsDataURL(file); //读取图片资源
      reader.onload = (e) => {
        //读取成功
        img.src = e.target.result;
        const { width: originWidth, height: originHeight } = img; //上传的图片的宽高
        const maxWidth = 1000, //设置一个canvas 的最大宽高
          maxHight = 1000;
        if (originWidth > maxWidth || originHeight > maxHight) {
          //计算出图片的缩放比例
          if (originWidth > originHeight) {
            //宽 大于 高
            const Proportion = Math.ceil(originWidth / maxWidth);
            let targetWidht = parseInt(originWidth / Proportion); //目标的宽度
            let targetHeight = parseInt(originHeight / Proportion); //目标的高度
            this.createCanvasCompress(targetWidht, targetHeight, img, files);
          } else {
            const Proportion = Math.ceil(originHeight / maxHight); //高大于宽
            let targetWidht = parseInt(originWidth / Proportion); //目标的宽度
            let targetHeight = parseInt(originHeight / Proportion); //目标的高度
            let bold = this.createCanvasCompress(
              targetWidht,
              targetHeight,
              img,
              files
            );
          }
        } else {

          let quality = 0.8;
          this.createCanvasCompress(
            originWidth,
            originHeight,
            img,
            files,
            quality
          );
        }
      };
    },

    createCanvasCompress(targetWidth, targetHeight, img, files, quality) {
      let that = this;
      return new Promise((resolve, reject) => {
        const canvas = document.createElement("canvas");
        const context = canvas.getContext("2d");
        // 设置宽高度为等同于要压缩图片的尺寸
        canvas.width = targetWidth;
        canvas.height = targetHeight;
        context.clearRect(0, 0, targetWidth, targetHeight);
        //将img绘制到画布上
        console.log(targetWidth, targetHeight);
        context.drawImage(img, 0, 0, targetWidth, targetHeight);
        files.content = canvas.toDataURL(files.file.type, 0.8); // 0.92为默认压缩质量
        const newFile = this.dataURLtoFile(files.content, files.file.name);
        const formData = new FormData();
        formData.append("file[]", newFile);
        formData.append("private", 0);
        let dirName = "voucher_img";
        formData.append("dir", dirName);
        console.log(newFile);
        
        upload(formData)
          .then((res) => {
            this.rechargeFile = res.data.data;
            files.status = "";
            files.message = "";
          })
          .catch((err) => {
            files.status = "failed";
            files.message = "上传失败";
          });
      });
    },
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值