vue图片上传组件,实现批量上传和单张上传功能,控制图片大小,数量,以及压缩处理,利用了mint-ui的提示框
监听两个参数,分别是MAX控制最多上传的数量,multiple控制是否批量上传,self.$emit(‘fileChange’, {base64, file, files});将处理后的数据通过自定义事件传递给父组件,父组件获取到压缩处理后的文件就可以使用AJAX等技术post给后台实现文件上传功能
————————————————
版权声明:本文为CSDN博主「cuteccc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cuteccc/java/article/details/78462250
<template>
<div>
<input ref="file"
type="file"
class="file-input"
accept="image/*"
:multiple="multiple"
@change="change"/>
</div>
</template>
<script>
import {Indicator, MessageBox} from 'mint-ui';
// M设定可以上传图片的大小
const M = 7;
const UNIT = 1024;
const MAX_SIZE = M * UNIT * UNIT;
/**
* @author xx
*
* @desc 图片上传
* @module @components/updatefile
*
* @example
* import {updatefile} from @components
* Vue.component(Updatefile.name, Updatefile)
* <updatefile :multiple="multiple"
* :max="max"
* @refDom="getDom"
* @fileChange="fileChange">
* </updatefile>
*/
export default {
name: 'updatefile',
/**
* @member {Object}
* @name props
* @property {Boolean} multiple 是否可以同时上传多个文件
* @property {Number} max 最多一次可以上传多少张
*/
props: {
multiple: Boolean,
max: Number
},
data() {
return {
};
},
mounted() {
this.getDom();
},
methods: {
// 获取dom元素外部点击触发
getDom() {
let file = this.$refs.file;
this.$emit('refDom', file);
},
// 图片数量是否超过max张
isOutNumber(files) {
const MAX = this.max;
if (files.length > MAX) {
MessageBox({
title: '提示',
message: `一次最多允许上传${MAX}张!`
});
return true;
} else {
return false;
}
},
change(e) {
let files = e.target.files;
// 如果超过设定的张数张,提示
if (this.isOutNumber(files)) {
return;
}
let len = files.length;
for (let i = 0; i < len; i++) {
if (window.FileReader && files[i]) {
if (files[i].size <= MAX_SIZE) {
Indicator.open();
// 读取文件转化图片base64
let fr = new FileReader();
let self = this;
fr.onload = (e) => {
let w = 300;
let h = 300;
let file = files[i];
let compressPic = function(base64) {
// 将压缩处理后的图片传递出去
self.$emit('fileChange', {base64, file, files});
};
self.canvasDataUrl(e.target.result, w, h, compressPic);
};
fr.onerror = (e) => {
Indicator.close();
};
fr.readAsDataURL(files[i]);
} else {
MessageBox({
title: '警告',
message: `${files[i].name}图片尺寸过大,图片请小于7M!`
});
}
}
}
},
// 利用canvas压缩图片
canvasDataUrl(data, w, h, callback) {
let newImg = new Image();
newImg.src = data;
let imgWidth, imgHeight;
newImg.onload = () => {
let img = document.createElement('img');
img.src = newImg.src;
imgWidth = img.width;
imgHeight = img.height;
let canvas = document.createElement('canvas');
let ctx = canvas.getContext('2d');
if (imgWidth > imgHeight) {
imgWidth = w * imgWidth / imgHeight;
imgHeight = h;
} else {
imgHeight = h * imgHeight / imgWidth;
imgWidth = w;
};
canvas.width = imgWidth;
canvas.height = imgHeight;
ctx.clearRect(0, 0, w, h);
// 处理png格式图片背景变黑的问题
ctx.fillStyle = '#fff';
ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0, imgWidth, imgHeight);
let rate = 0.7;
let base64 = canvas.toDataURL('image/jpeg', rate);
callback(base64);
};
}
}
};
</script>
浏览器地址栏输入
data:image/jpeg;base64,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