<template> <el-upload :action="uploadUrl" :headers="headers" :max-size="maxSize" :format="format" :data="uploadDataDict" :before-upload="handleBeforeUpload" :on-error="handleError" :on-success="handleSuccess" :http-request="upload" :show-file-list="false" style="display:inline-block;margin: 0 18px;" ref="UploadComp" > <el-button :type="btnType" :icon="btnIcon" :loading="loading">{{ btnContent }}</el-button> </el-upload> </template> <script> import { fileMD5 } from "../plugins/md5"; import ajax from "../plugins/ajax"; export default { name: "upload-button", props: { btnIcon: { type: String }, btnType: { type: String, default: "default" }, btnContent: { type: String }, format: { type: Array, default() { return ["jpg", "jpeg", "png"]; } }, uploadUrl: { type: String, required: true }, uploadData: { type: Object, default() { return {}; } }, maxSize: { type: Number, default: 20 * 1024 * 1024 }, addFilenameParam: { type: String, default: "filename" } }, data() { return { headers: { token: "", md5: "" }, res: {}, loading: false, uploadDataDict: {} }; }, methods: { checkFileFormat(fileType) { const _file_format = fileType .split(".") .pop() .toLocaleLowerCase(); return this.format.length ? this.format.some(item => item.toLocaleLowerCase() === _file_format) : true; }, async handleBeforeUpload(file) { this.uploadDataDict = { ...this.uploadData }; this.uploadDataDict[this.addFilenameParam] = file.name; if (file.size > this.maxSize) { this.handleExceededSize(); return Promise.reject(); } if (!this.checkFileFormat(file.name)) { this.handleFormatError(); return Promise.reject(); } const md5 = await fileMD5(file); this.headers["md5"] = md5; this.loading = true; return true; }, upload(options) { return ajax(options); }, handleError(error) { this.loading = false; this.res = { success: false, message: error.message }; this.$emit("upload-error", error); }, handleSuccess(response) { this.loading = false; if (response.code === "200") { this.res = { success: true, message: "导入成功!" }; this.$emit("upload-success", response); } else { this.handleError(response); } }, handleFormatError() { const content = "只支持文件格式为" + this.format.join("/"); this.res = { success: false, message: content }; this.$emit("upload-error", this.res); }, handleExceededSize() { const content = "文件大小不能超过" + Math.floor(this.maxSize / (1024 * 1024)) + "M"; this.res = { success: false, message: content }; this.$emit("upload-error", this.res); } } }; </script>