<template>
<div class="upload-file">
<div class="text-center w-100" v-if="filelist.length == 0 && disabled">
<el-empty
:image-size="80"
description="暂无附件"
style="padding: 0"
></el-empty>
</div>
<!-- 文件列表 -->
<transition-group
v-show="filelist.length || !disabled"
class="upload-file-list el-upload-list el-upload-list--text flex flex-wrap"
name="el-fade-in-linear"
tag="div"
>
<div
:key="file.url"
class="el-upload-list__item ele-upload-list__item-content list_item"
v-for="(file, index) in filelist"
>
<div class="file">
<el-image
class="imgBOx"
:src="file.url"
:preview-src-list="imglist"
v-if="isImage(file.url)"
fit="cover"
>
</el-image>
<el-image
class="imgBOx"
style="width: 96px"
:src="word"
@click="downClick(file)"
v-else-if="isWord(file.name)"
fit="cover"
>
</el-image>
<el-image
class="imgBOx"
style="width: 96px"
:src="pdf"
@click="downClick(file)"
v-else-if="isPdf(file.name)"
fit="cover"
>
</el-image>
<el-image
class="imgBOx"
style="width: 96px"
v-else-if="isExcel(file.name)"
:src="excel"
@click="downClick(file)"
fit="cover"
>
</el-image>
<el-image
class="imgBOx"
style="width: 96px"
v-else-if="isMp4(file.name)"
:src="video"
@click="downClick(file)"
fit="cover"
>
</el-image>
<!-- <div
class="ellipsis-1"
style="width: 100px; color: #f59a23; cursor: pointer;line-height:25px"
@click="downClick(file)"
>
{{ file.name }}
</div> -->
</div>
<img
src="@/assets/images/uploadFile/close.png"
v-show="!disabled"
class="close"
@click="handleDelete(index)"
alt=""
/>
</div>
<div
:key="1"
v-if="filelist.length < limit"
class="el-upload-list__item ele-upload-list__item-content"
style="margin-right: 0; "
>
<el-upload
:action="uploadFileUrl"
:before-upload="handleBeforeUpload"
:file-list="filelist"
:limit="limit"
:on-error="handleUploadError"
:on-success="handleUploadSuccess"
:show-file-list="false"
:headers="headers"
:accept="fileType.toString()"
:on-exceed="handleExceed"
class="upload-file-uploader"
ref="upload"
name="file"
>
<!-- 上传按钮 -->
<div class="plus" v-show="!disabled">
<i class="el-icon-plus"></i>
<div>上传</div>
</div>
</el-upload>
</div>
</transition-group>
<div style="color:#999">{{desc}}</div>
</div>
</template>
<script>
import { getToken } from "@/utils/auth";
export default {
props: {
// 大小限制(MB)
fileSize: {
type: Number,
default: 200,
},
// 文件类型, 例如['png', 'jpg', 'jpeg']
fileType: {
type: Array,
default: () => [],
},
// 是否显示提示
isShowTip: {
type: Boolean,
default: true,
},
filelist: {
type: Array,
default: () => [],
},
disabled: {
type: Boolean,
default: false,
},
limit: {
type: Number,
default: 100,
},
desc: {
type: String,
default:'800*800 像素,仅支持JPG/PNG格式。'
}
},
data() {
return {
uploadFileUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 上传的图片服务器地址
headers: {
Authorization: "Bearer " + getToken(),
},
loading: false,
word: require("@/assets/images/uploadFile/word.png"),
excel: require("@/assets/images/uploadFile/excel.png"),
pdf: require("@/assets/images/uploadFile/pdf.png"),
video: require("@/assets/images/uploadFile/video.png"),
imglist: [],
};
},
computed: {
// 是否显示提示
showTip() {
return this.isShowTip && (this.fileType || this.fileSize);
},
},
watch: {
filelist: {
handler(newVal, oldVal) {
this.imglist = [];
newVal.forEach((item) => {
if (this.isImage(item.name)) {
this.imglist.push(item.url);
}
});
},
deep: true,
immediate: true,
},
},
methods: {
downClick(file) {
if (file.fileName) {
this.download(file.fileName);
}
}, //下载
loadTableImg(img) {
return process.env.VUE_APP_BASE_API + img;
}, // 加载图片load
// 上传前校检格式和大小
handleBeforeUpload(file) {
// 校检文件大小
if (this.fileSize) {
const isLt = file.size / 1024 / 1024 < this.fileSize;
if (!isLt) {
this.$message.error(`上传文件大小不能超过 ${this.fileSize} MB!`);
return false;
}
}
if (this.fileType.length) {
let fileExtension = "";
if (file.name.lastIndexOf(".") > -1) {
fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
}
const isTypeOk = this.fileType.some((type) => {
if (file.type.indexOf(type) > -1) return true;
if (fileExtension && fileExtension.indexOf(type) > -1) return true;
return false;
});
if (!isTypeOk) {
this.$message.error(
`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`
);
return false;
}
}
this.loading = this.$loading({
lock: true,
text: "Loading",
spinner: "el-icon-loading",
});
return true;
},
// 上传失败
handleUploadError(err) {
this.loading.close();
this.$message.error("上传失败, 请重试");
},
// 上传成功回调
handleUploadSuccess(res, file) {
this.loading.close();
if (res.code == 500) {
this.$message.error(res.msg);
return;
}
this.$message.success("上传成功");
file.response.uid = new Date().getTime();
file.response.name = file.name;
file.response.size = file.size;
this.$emit("setFile", file.response);
},
handleExceed() {
this.$message.warning(`当前限制选择 ${this.limit} 个文件`);
},
// 删除文件
handleDelete(index) {
this.$emit("delFile", index);
},
//是图片
isImage(name) {
return (
name.replace(/.+\./g, "") == "png" ||
name.replace(/.+\./g, "") == "jpg" ||
name.replace(/.+\./g, "") == "tif" ||
name.replace(/.+\./g, "") == "svg" ||
name.replace(/.+\./g, "") == "pcd" ||
name.replace(/.+\./g, "") == "dxf" ||
name.replace(/.+\./g, "") == "jpeg"
);
},
//是word
isWord(name) {
return (
name.replace(/.+\./g, "") == "docx" ||
name.replace(/.+\./g, "") == "doc"
);
},
//是excel
isExcel(name) {
return (
name.replace(/.+\./g, "") == "xls" ||
name.replace(/.+\./g, "") == "xlsx"
);
},
isPdf(name) {
return name.replace(/.+\./g, "") == "pdf";
},
isMp4(name) {
return (
name.replace(/.+\./g, "") == "mp4" ||
name.replace(/.+\./g, "") == "rmvb" ||
name.replace(/.+\./g, "") == "avi" ||
name.replace(/.+\./g, "") == "mpeg"
);
},
},
created() {},
};
</script>
<style scoped lang="scss">
.imgBOx {
width: 100px;
height: 100px;
position: relative;
.tk {
// display: none;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
color: #fff;
display: flex;
align-items: center;
justify-content: center;
}
&:hover {
.tk {
display: block;
}
}
}
.plus {
width: 100px;
height: 100px;
border: 1px solid #afbcd0;
display: flex;
align-items: center;
justify-content: center;
position: relative;
flex-direction: column;
i {
font-size: 50px;
color: #afbcd0;
}
div{
position: absolute;
bottom: 15px;
font-size: 12px;
color: #999999;
}
}
.upload-file {
// display: flex;
// align-items: center;
// justify-content: flex-start;
}
.upload-file-uploader {
width: 100px;
// margin-left: 20px;
margin-bottom: 0;
}
.upload-file-list{
margin-block-start:0;
margin-block-end: 0;
padding-inline-start: 0;
}
.upload-file-list .el-upload-list__item {
width: 100px;
margin-right: 20px;
cursor: pointer;
position: relative;
line-height: 0;
&:first-child{
margin-top: 0;
}
}
.upload-file-list .ele-upload-list__item-content {
display: flex;
justify-content: space-between;
align-items: center;
color: inherit;
}
.list_item{
top: 3px;
}
.ele-upload-list__item-content-action .el-link {
margin-right: 10px;
}
.upload-file-list .ele-upload-list__item-content .close {
position: absolute;
top: -10px;
right: -10px;
}
.el-upload-list__item:hover {
background-color: transparent;
}
</style>
图片以及上传路径自己替换即可