vue+H5移动端实现图片压缩上传

应用场景:在前端需要把图片通过接口上传到云端来获取图片id或url传给后端的时候如果是用的input file的方法来获取图片的时候有些移动端浏览器是不支持图片过大的,这个时候就需要将图片压缩,下面是操作方面

<template>
  <div>
    <!-- 获取图片 -->
    <div>
      <input
        ref="fileInput"
        type="file"
        accept="image/*"
        @change="handleFileChangeXC"
      />
      <canvas ref="canvas" style="display: none"></canvas>
    </div>
  </div>
</template>
<script>
import { getfileUpload } from "@/api/index";

export default {
  data() {
    return {
      imageDataUrl1: "",
      imgBlib: {},
    };
  },
  methods: {
    // 上传图片
    handleFileChangeXC(event) {
      // 压缩
      const canfile = event.target.files[0];
      if (!canfile) {
        return;
      }
      const canreader = new FileReader();
      canreader.onload = (e) => {
        const canimg = new Image();
        canimg.onload = () => {
          const canCompression = 0.1; //压缩参数,0.1压缩为原图10%
          const canvas = this.$refs.canvas;
          const ctx = canvas.getContext("2d");
          const ratio = Math.min(
            canimg.width / canvas.width,
            canimg.height / canvas.height
          );
          canvas.width = canimg.width / ratio;
          canvas.height = canimg.height / ratio;
          ctx.drawImage(canimg, 0, 0, canvas.width, canvas.height);
          canvas.toBlob(
            (blob) => {
              // 这里可以处理压缩后的图片blob,比如上传到服务器
              console.log(blob); 
              this.imgBlib = blob; // 把压缩好的blob文件存储到data定义的字段里
              // 调用阿里接口上传图片
              const files = event.target.files;
              if (files.length > 0) {
                const file = files[0];
                const originalLastModified = file.lastModified;
                const originalFileName = file.name;
                const originalFileType = file.type;
                console.log(file);
                // 合并
                const newFile = new File([this.imgBlib],originalFileName, file, {
                  type: originalFileType,
                  lastModified: originalLastModified,
                });
                console.log(newFile, "合并的");
                // 调用阿里接口
                getfileUpload({ // 阿里的接口,这里换成你们自己的接口
                  file: newFile,
                }).then((res) => {
                  this.imageDataUrl1 = res.data.data.annex_id;//拿到阿里回馈的id
                });
              }
            },
            "image/jpeg",
            canCompression
          );
        };
        canimg.src = e.target.result;
      };
      canreader.readAsDataURL(canfile);
    },
  },
};
</script>

这样的解决方案只适用于在上传图片的时候因为图片过大无法成功调取阿里接口的时候来应用,一些其他的操作可以自己在代码中增加。此外,在input file获取图片的时候在移动端也会调出相机,这个可以解决相机拍照生成的图片过大无法上传到阿里接口,大家在用的时候可以根据自己的实际情况来调整压缩的参数。如果有同学在使用的时候有其他的问题可以评论区留言讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值