图片压缩后上传

24 篇文章 0 订阅
8 篇文章 0 订阅

图片压缩后上传

html部分

	// 上传图片
    <div class="fileBox">
     <span class="fileinput-button">
      <div class="file_plus">
        <i class="iconfont icon-zhaoxiangji" />
     </div>
         <input
           type="file"
           ref="selectFile"
           accept="image/*"
           style="width: 100px; height: 90px"
           @change="getFileOthers($event, index)"
         />
    </span>
   </div>

js部分

 // vue中data的数据
	 data() {
	 // 图片路径
      fileList: [[]],
       account: 0,
	 }
  
  // js 部分
   // 上传图片方法
    getFileOthers(e, index) {
      let _this = this;
      _this.account = index;
      var files = e.target.files[0];
      // 转化为文件对象
      let formData = new FormData();
      if (!e || !window.FileReader) return; // 看支持不支持FileReader
      let reader = new FileReader();
      reader.readAsDataURL(files); // 将读取到的文件编码成DataURL
      // 压缩图片
      reader.onload = function(ev) {
        try {
          // 读取图片来获得上传图片的宽高
          let img = new Image();
          img.src = ev.target.result;
          img.onload = function(ev) {
            // 将图片绘制到canvas画布上进行压缩
            let canvas = document.createElement("canvas");
            let context = canvas.getContext("2d");
            let imgWidth = img.width;
            let imgHeight = img.height;
            // 按比例缩放后图片宽高;
            let targetWidth = imgWidth;
            let targetHeight = imgHeight;
            // /如果原图宽大于最大宽度
            if (targetWidth > targetHeight) {
              let scale = targetHeight / 1280; //原图宽高比例
              targetHeight = 1280;
              targetWidth = targetWidth / scale;
              console.log(targetWidth);
            } else {
              let scale = targetWidth / 1280; //原图宽高比例
              targetWidth = 1280;
              targetHeight = targetHeight / scale;
              console.log(targetHeight);
            }
            //缩放后高度仍然大于最大高度继续按比例缩小
            canvas.width = targetWidth; //canvas的宽=图片的宽
            canvas.height = targetHeight; //canvas的高=图片的高
            context.clearRect(0, 0, canvas.width, canvas.height);
            context.drawImage(this, 0, 0, canvas.width, canvas.height);
            let data = "";
            console.log(files);
            // 如果图片小于1Mb,不进行压缩,并返回二进制流
            if (files.size <= 1048288) {
                // 压缩文件大小比例
              data = canvas.toDataURL("image/jpeg");
              console.log(data);
              formData.append("file", files);
              // _this.uploadData(formData, files, index);
            }
            // 如果图片大于1Mb,进行压缩,并返回二进制流
            else {
              data = canvas.toDataURL("image/jpeg", 0.4);
              console.log(data);
              let paper = _this.dataURLtoFile(data, files.name);
              formData.append("file", paper);
            }
            let fileArr = [];
            fileArr.push(data);
            _this.fileList[_this.account].push(...fileArr);
            // 清空选中文件,以备下一个文件上传
            _this.$refs.selectFile.value = "";
            _this.uploadData(formData, files, index);
            // _this.source = ideaService.uploadFile();
          };
        } catch (e) {
          console.log("error", e);
          // 提示:文件格式不正确,请重新选择!
        }
      };
    },
  //  封装实现图片压缩方法
  // 将base64转换为file文件
    dataURLtoFile(dataurl, filename) {
      let arr = dataurl.split(",");
      let mime = arr[0].match(/:(.*?);/)[1];
      let bstr = atob(arr[1]);
      let n = bstr.length;
      let u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new File([u8arr], filename, { type: mime });
    },
    
     // 上传文件到后台
    uploadData(formData, files, index) {
      this.achieve = false;
      if (files) {
        ideaService.uploadFile(formData).then(res => {
          if (res.data.errno === 0) {
            this.pathItems.push([]);
            this.pathItems[index].push(res.data.data);
            this.$toast.success("文件上传成功");
            this.achieve = true;
            // this.filePath = res.data.data.name;
          } else {
            this.$toast.fail(res.data.data.message);
          }
        });
      }
    },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周亚鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值