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