Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

<el-upload> 实现图片压缩上传 #12

Open
RicoLiu opened this issue Mar 17, 2019 · 0 comments
Open

<el-upload> 实现图片压缩上传 #12

RicoLiu opened this issue Mar 17, 2019 · 0 comments

Comments

@RicoLiu
Copy link
Owner

RicoLiu commented Mar 17, 2019

el-upload 组件不支持图片压缩上传,只能自己实现了。

图片压缩核心就是:canvas

compress.js

/** 图片压缩
 * @param {Number} orient iphone & android 拍照图片方向
 * @param {Object} fileObj 图片对象
 * @param {function} cb 回调函数
 */
export function compress (orient, fileObj, cb) {
  try {
    // 压缩图片需要的一些元素和对象
    let img = new Image();

    // 缩放图片需要的canvas
    let canvas = document.createElement('canvas');
    let context = canvas.getContext('2d');
    img.src = URL.createObjectURL(fileObj);
    // base64地址图片加载完毕后
    img.onload = function () {
      // 图片原始尺寸
      let originWidth = this.width;
      let originHeight = this.height;

      if (originWidth > originHeight && originWidth > 750) {
        originWidth = 750;
        originHeight = Math.ceil(750 * this.height / this.width);
      } else if (originWidth < originHeight && originHeight > 1334) {
        originWidth = Math.ceil(1334 * this.width / this.height);
        originHeight = 1334;
      }
      let targetWidth = originWidth;
      let targetHeight = originHeight;
      // canvas对图片进行缩放
      canvas.width = targetWidth;
      canvas.height = targetHeight;
      // 清除画布
      context.clearRect(0, 0, targetWidth, targetHeight);
      if (orient && orient !== 1) {
        switch (orient) {
          case 6:
            canvas.width = targetHeight;
            canvas.height = targetWidth;
            context.rotate(Math.PI / 2);
            context.drawImage(img, 0, -targetHeight, targetWidth, targetHeight);
            break;
          case 3:
            context.rotate(Math.PI);
            context.drawImage(img, -targetWidth, -targetHeight, targetWidth, targetHeight);
            break;
          case 8:
            canvas.width = targetHeight;
            canvas.height = targetWidth;
            context.rotate(3 * Math.PI / 2);
            context.drawImage(img, -targetWidth, 0, targetWidth, targetHeight);
            break;
          default:
            context.drawImage(img, 0, 0, targetWidth, targetHeight);
            break;
        }
      } else {
        context.drawImage(img, 0, 0, targetWidth, targetHeight);
      }
      // 图片压缩
      // context.drawImage(img, 0, 0, targetWidth, targetHeight);
      // canvas转为blob并上传
      canvas.toBlob(function (blob) {
        cb(blob);
        console.log('压缩成功 toblob ', URL.createObjectURL(blob));
      }, fileObj.type || 'image/png');
    };
  } catch (e) {
    console.log('压缩失败:', e)
  }
}

upload.vue

import { compress } from './compress.js'

handlePictureCardPreview(file) {
        compress(file.raw, function(val) {
          console.log('success.....', URL.createObjectURL(val))
          let formdata = new FormData();
          formdata.append('file', val);
          // 图片ajax上传
          let xhr = new XMLHttpRequest();
          // 文件上传成功
          xhr.onreadystatechange = function() {
            if (xhr.status == 200) {
              // xhr.responseText就是返回的数据
              console.log('response data: ', xhr.responseText)
            }
          };
          // 开始上传
          xhr.open("POST", "xxxxxx", true);
          xhr.send(formdata);
       })
},
beforeAvatarUpload(file) {
        const isJPG = file.type === 'image/png' || file.type === 'image/gif' || file.type === 'image/jpg' || file.type === 'image/jpeg';
        const isLt10M = file.size / 1024 / 1024 < 10;
        if (!isJPG) {
          this.$message.error('上传头像图片只能是 JPG,gif,png,jpeg 格式!');
        }
        if (!isLt10M) {
          this.$message.error('上传头像图片大小不能超过 10MB!');
        }
        return false;
},
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant