before-upload 方法,传入了fIle
file 其实是一个blob对象,可以直接创建 一个 url
之后就是new Image + promise,在onload 中 resolve
这个问题的难点是一开始不知道 before-upload 是支持异步 的。
后面才知道 before-upload 方法直接返回reject 状态的promise 就可以
代码如下;
function GenerageVerifyPicMeasurement(x: number, y: number) {
return function (file: any) { // file 必须是 element-ui 的uplaod 组件 传入的file 类型,是一个blob
return new Promise((resolve, reject) => {
var urlCreator = window.URL || window.webkitURL;
var imageUrl = urlCreator.createObjectURL(file);
let img = new Image();
img.src = imageUrl;
img.onload = function name(e) {
var width = img.naturalWidth;
var height = img.naturalHeight;
if (width == x && height == y) {
resolve(true)
} else {
reject(false)
file.value = "";
}
}
})
}
}
// 下面是vue 的部分代码
created() {
this._verifyPic = GenerageVerifyPicMeasurement(this.verfiySize[0] as number, this.verfiySize[1] as number);
},
data() {
return {
setUploadHeader: {
Authorize: getCookie(),
},
};
},
destroyed() {},
methods: {
handleBeforeUpload(file: File) {
let index = file.name.lastIndexOf(".");
let fileType = file.name.slice(index);
let regImage = /(.jpg|.jpeg|.gif|.png|.bmp)$/g;
const isLimitSize = file.size / 1024 / 1024 < 5;
return new Promise(async (resolve, reject) => {
if (this.verfiySize[0] !== 0) {
try {
let verifySize = await this._verifyPic(file);
if (!verifySize) {
this.$AlertTip(`请上传正确的图片尺寸${this.verfiySize[0]}*${this.verfiySize[1]}px`);
reject(verifySize);
}
} catch (error) {
this.$AlertTip(`请上传正确的图片尺寸${this.verfiySize[0]}*${this.verfiySize[1]}px`);
reject(false);
}
}
if (!regImage.test(fileType)) {
this.$AlertTip("请上传正确的图片格式文件");
reject(false);
}
if (!isLimitSize) {
this.$AlertTip("上传的图片最大不能超过5M");
reject(false);
}
resolve(true);
});
},
}
URL.createObjectURL()文档:
https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL