welcome

图片压缩并上传

1、压缩方法公共js

/** 图片压缩,默认同比例压缩
 *  @param {Object} fileObj
 *  图片对象
 *  回调函数有一个参数,base64的字符串数据
 */
 export function compress(fileObj, callback) {
  try {
    const image = new Image()
    image.src = URL.createObjectURL(fileObj)
    image.onload = function() {
      const that = this
      // 默认按比例压缩
      let w = that.width
      let h = that.height
      const scale = w / h
      w = fileObj.width || w
      h = fileObj.height || (w / scale)
      let quality = 0.7 // 默认图片质量为0.7
      // 生成canvas
      const canvas = document.createElement('canvas')
      const ctx = canvas.getContext('2d')
      // 创建属性节点
      const anw = document.createAttribute('width')
      anw.nodeValue = w
      const anh = document.createAttribute('height')
      anh.nodeValue = h
      canvas.setAttributeNode(anw)
      canvas.setAttributeNode(anh)
      ctx.drawImage(that, 0, 0, w, h)
      // 图像质量
      if (fileObj.quality && fileObj.quality <= 1 && fileObj.quality > 0) {
        quality = fileObj.quality
      }
      // quality值越小,所绘制出的图像越模糊
      const data = canvas.toDataURL('image/jpeg', quality)
      // 压缩完成执行回调
      const newFile = convertBase64UrlToBlob(data)
      callback(newFile)
    }
  } catch (e) {
    console.log('压缩失败!')
  }
}
function convertBase64UrlToBlob(urlData) {
  const bytes = window.atob(urlData.split(',')[1]) // 去掉url的头,并转换为byte
  // 处理异常,将ascii码小于0的转换为大于0
  const ab = new ArrayBuffer(bytes.length)
  const ia = new Uint8Array(ab)
  for (let i = 0; i < bytes.length; i++) {
    ia[i] = bytes.charCodeAt(i)
  }
  return new Blob([ab], { type: 'image/png' })
}

 

2、el-upload上传组件

<el-upload
  name="file"
  class="upload"
  list-type="picture-card"
  action="#"
  accept="image/jpeg, image/jpg, image/png"
  :file-list="fiilList"
  :on-change="uploadChange"
  :multiple="false"
  :limit="1"
  :auto-upload="false"
>

 

3、js部分

import { compress } from '@/utils/compress.js'
import { AjaxUploadImg } from '@/utils/uploadImg.js'
uploadChange(file, fileList) {
      const _this = this;
      const isLt1M = file.size / 1024 / 1024 < 1;
      // 上传图片不能大于1M
      if (!isLt1M) {
     console.log('上传图片不能大于1M')
     return false; } else { const isLt04 = file.size / 1024 / 1024 > 0.4; // 上传图片大于400KB再压缩 if(isLt04) { // 压缩图片 compress(file.raw, function(val) { let params = { file: val, type: 1, id: _this.officialInfo.id } _this.uploadImg(params, file.name, fileList); }) } else { let params = { file: file.raw, type: 1, id: _this.officialInfo.id } _this.uploadImg(params, file.name, fileList); } } }, uploadImg(params, fileName, fileList) { const _this = this; AjaxUploadImg(_this.uploadUrl, params, fileName, function(res) { let data = JSON.parse(res) if(data.code==200){ console.log('上传成功!') } else { _this.$message.error("图片上传失败!"); } }); },

 

封装的请求方式:uploadImg.js

/** 
 * 原生AJAX请求
 * 上传图片
 * url     服务器地址
 * data    传递的参数
 * imgName 图片名称
 * fn      返回的数据
 */
// bus为vue对象
import bus from "./bus";
export function AjaxUploadImg(url, data, imgName, fn) {
  let formData = new FormData();
  for (const key in data) {
    if(key == 'file'){
      // 判断是否为blob对象
      if(data[key] instanceof Blob){
        // blob对象转file对象
        let files = new window.File([data[key]], imgName)
        formData.append('file', files);
      } else {
        formData.append('file', data[key]);
      }
    } else {
      formData.append(key, data[key]);
    }
  }
  // 建立请求
  var xhr = new XMLHttpRequest();
  xhr.open("POST", url, true);
  xhr.setRequestHeader("Authorization", "Bearer " + bus.$cookieGet("TOKEN"));
  xhr.onreadystatechange = function() {
    if(xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) {
      fn.call(this, xhr.responseText);
    }
  };
  xhr.send(formData);
}

 

PS:压缩方法公共js来源于https://blog.csdn.net/liona_koukou/article/details/84860899

 

posted @ 2021-10-21 16:51  一首弦曲献仙音  阅读(275)  评论(0编辑  收藏  举报
//博文图片放大缩小 //飘桃花效果