<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>