<template> <el-dialog :before-close="handleClose" :close-on-click-modal="false" :title="title" :visible.sync="dialogFormVisible" width="909px" > <div class="upload"> <el-alert :closable="false" :title="`支持jpg、jpeg、png格式,单次可最多选择${limit}张图片,每张不可大于${size}M,如果大于${size}M会自动为您过滤`" type="info" ></el-alert> <br /> <el-upload ref="upload" :action="action" :auto-upload="false" :close-on-click-modal="false" :data="data" :file-list="fileList" :headers="headers" :limit="limit" :multiple="true" :name="name" :on-change="handleChange" :on-error="handleError" :on-exceed="handleExceed" :on-preview="handlePreview" :on-progress="handleProgress" :on-remove="handleRemove" :on-success="handleSuccess" accept="image/png, image/jpeg" class="upload-content" list-type="picture-card" > <i slot="trigger" class="el-icon-plus"></i> <el-dialog :visible.sync="dialogVisible" append-to-body title="查看大图" > <div> <img :src="dialogImageUrl" alt="" width="100%" /> </div> </el-dialog> </el-upload> </div> <div slot="footer" class="dialog-footer" style="position: relative; padding-right: 15px; text-align: right" > <div v-if="show" style="position: absolute; top: 10px; left: 15px; color: #999" > 正在上传中... 当前上传成功数:{{ imgSuccessNum }}张 当前上传失败数:{{ imgErrorNum }}张 </div> <el-button type="primary" @click="handleClose">关闭</el-button> <el-button :loading="loading" size="small" style="margin-left: 10px" type="success" @click="submitUpload" > 开始上传 </el-button> </div> </el-dialog> </template> <script> import { baseURL, tokenName } from '@/config/settings' export default { name: 'VabUpload', props: { url: { type: String, default: '/upload', required: true, }, name: { type: String, default: 'file', required: true, }, limit: { type: Number, default: 50, required: true, }, size: { type: Number, default: 1, required: true, }, }, data() { return { show: false, loading: false, dialogVisible: false, dialogImageUrl: '', action: 'https://vab-unicloud-3a9da9.service.tcloudbase.com/upload', headers: {}, fileList: [], picture: 'picture', imgNum: 0, imgSuccessNum: 0, imgErrorNum: 0, typeList: null, title: '上传', dialogFormVisible: false, data: {}, } }, computed: { percentage() { if (this.allImgNum == 0) return 0 return this.$baseLodash.round(this.imgNum / this.allImgNum, 2) * 100 }, }, methods: { submitUpload() { this.$refs.upload.submit() }, handleProgress(event, file, fileList) { this.loading = true this.show = true }, handleChange(file, fileList) { if (file.size > 1048576 * this.size) { fileList.map((item, index) => { if (item === file) { fileList.splice(index, 1) } }) this.fileList = fileList } else { this.allImgNum = fileList.length } }, handleSuccess(response, file, fileList) { this.imgNum = this.imgNum + 1 this.imgSuccessNum = this.imgSuccessNum + 1 if (fileList.length === this.imgNum) { setTimeout(() => { this.$baseMessage( `上传完成! 共上传${fileList.length}张图片`, 'success' ) }, 1000) } setTimeout(() => { this.loading = false this.show = false }, 1000) }, handleError(err, file, fileList) { this.imgNum = this.imgNum + 1 this.imgErrorNum = this.imgErrorNum + 1 this.$baseMessage( `文件[${file.raw.name}]上传失败,文件大小为${this.$baseLodash.round( file.raw.size / 1024, 0 )}KB`, 'error' ) setTimeout(() => { this.loading = false this.show = false }, 1000) }, handleRemove(file, fileList) { this.imgNum = this.imgNum - 1 this.allNum = this.allNum - 1 }, handlePreview(file) { this.dialogImageUrl = file.url this.dialogVisible = true }, handleExceed(files, fileList) { this.$baseMessage( `当前限制选择 ${this.limit} 个文件,本次选择了 ${files.length} 个文件`, 'error' ) }, handleShow(data) { this.title = '上传' this.data = data this.dialogFormVisible = true }, handleClose() { this.fileList = [] this.picture = 'picture' this.allImgNum = 0 this.imgNum = 0 this.imgSuccessNum = 0 this.imgErrorNum = 0 /* if ("development" === process.env.NODE_ENV) { this.api = process.env.VUE_APP_BASE_API; } else { this.api = `${window.location.protocol}//${window.location.host}`; } this.action = this.api + this.url; */ this.dialogFormVisible = false }, }, } </script> <style lang="scss" scoped> .upload { height: 500px; .upload-content { .el-upload__tip { display: block; height: 30px; line-height: 30px; } ::v-deep { .el-upload--picture-card { width: 128px; height: 128px; margin: 3px 8px 8px 8px; border: 2px dashed #c0ccda; } .el-upload-list--picture { margin-bottom: 20px; } .el-upload-list--picture-card { .el-upload-list__item { width: 128px; height: 128px; margin: 3px 8px 8px 8px; } } } } } </style>