页面操作逻辑步骤,先点击选择文件,选择完成之后,确认上传就行了
<template>
<el-button
size="small"
type=""
@click="handleUploadFile"
>选择文件el-button
>
<el-button type="primary" @click="handleAffirmFile">确认上传el-button>
<input
v-show="false"
ref="uploadFile"
type="file"
@change="handleAddFiles"
/>
<el-table
border=""
:data="tableFiles"
style="margin: 10px 0"
>
<el-table-column label="序号" type="index" width="70">el-table-column>
<el-table-column label="文件名" prop="fileName">el-table-column>
<el-table-column label="上传进度" prop="percent">
<template slot-scope="scope">
{{ changeViewText(scope.row["percent"]) }}
template>
el-table-column>
<el-table-column label="操作" width="140">
<template scope="scope">
<el-button
type="text"
@click="handleFileDel(scope.$index)"
>删除el-button
>
<el-button
type="text"
@click="handleRowCheck(scope.row)"
>查看el-button
>
<el-button
type="text"
@click="handleRowDownload(scope.row)"
>下载el-button
>
template>
el-table-column>
el-table>
template>
<script>
export default {
name:"file",
data() {
return {
fileDownloadUrl: window.ELS.api + "/fileData/service/download", // 下载
fileDisplaydUrl: window.ELS.api + "/fileData/service/display", // 查看,
tableFiles:[],// 附件表格数据
};
},
methods: {
changeViewText(num) {
const list = {
"-1": "上传失败",
0: "未上传",
100: "已上传",
} ;
return list[num] || `${num}%`;
},
// 选择上传文件弹框
handleUploadFile() {
this.$refs.uploadFile.value = "";
this.$refs.uploadFile.click();
},
// 删除附件
handleFileDel(index) {
this.tableFiles.splice(index, 1);
},
// 上传文件进度数据处理
handleProgress(item) {
return (event) => {
if (event.lengthComputable) {
item.percent = (event.loaded / event.total).toFixed(2) * 100;
}
};
},
// 确认上传
handleAffirmFile() {
const requestList = this.tableFiles
.filter((item) => item.isUpload == "0")
.map((item) => {
return this.handleRequestFiles({
data: item.file,
onProgress: this.handleProgress(item),
});
});
Promise.all(requestList)
.then((res) => {
this.handleRefresh(res);
})
.catch((err) => {
this.showCloseFiles = true;
this.$message.error(err.msg);
});
},
// 处理调用的接口传参逻辑
handleRequestFiles({ data, method = "post", onProgress = (e) => e }) {
const that = this;
return new Promise((resolve, reject) => {
const formData = new window.FormData(); // 表单格式
formData.append("file", data);
const xhr = new window.XMLHttpRequest();
xhr.open(method, that.upLoadUrl);
xhr.upload.onprogress = onProgress;
xhr.onreadystatechange = function (e) {
if (this.readyState === 4 && this.status === 200) {
const res = JSON.parse(this.response);
if (res.code === "200") {
resolve(res);
} else {
reject(res);
}
}
};
xhr.send(formData);
});
},
// 上传完成后的函数调用,根据返回数据和本地的数据重新组合所需要的附件内容
handleRefresh(resData = []) {
const parentData = this.tableFiles.filter((item) => item.isUpload == "1");
const files = resData.map((item) => {
const { fileName, fileUrl, ...others } = item.data || {};
return {
...others,
fileName: fileName,
isUpload: "1",
percent: 100,
url: `${window.ELS.api}/${fileUrl}`,
};
});
this.tableFiles = [...parentData, ...files];
},
// 查看
handleRowCheck(row) {
window.open(`${this.fileDisplaydUrl}/${row.id}`);
},
// 下载
handleRowDownload(row) {
window.open(`${this.fileDownloadUrl}/${row.id}`);
},
// 选择文件返回的回调函数,可以处理一些文件限制
handleAddFiles(event) {
const files = event.target.files;
const reg = /.(exe|cmd|sh|bat)$/;
const regCompress = /.(rar|zip)$/;
for (const item of files) {
if (reg.test(item["name"].toLocaleLowerCase())) {
return this.$message.error(
this.$t("不允许上传.exe、.cmd、.sh、.bat格式文件")
);
} else {
if (regCompress.test(item["name"].toLocaleLowerCase())) {
if (item.size > 30 * 1024 * 1024) {
return this.$message.error(this.$t("不允许上传超过30M的压缩包"));
}
} else {
if (item.size > 10 * 1024 * 1024) {
return this.$message.error(this.$t("不允许上传超过10M的文件"));
}
}
}
this.tableFiles.push({
fileName: item.name,
file: item,
percent: 0,
isUpload: "0",
});
}
},
},
}
script>