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 类型,是一个blobreturn 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
