# ytFileUpload 文件上传组件
# 实例属性
属性名 | 默认值 | 类型 | 描述 | 是否必填 |
---|---|---|---|---|
utilsObj | 见 utilsObj 配置表 | Object | 附件上传的配置项 | true |
actionUrl | "" | String | 文件上传的接口: 如:process.env.VUE_APP_BASE_API + "/file/upload" | true |
headerObj | {} | Object | 文件上传请求头参数(放在requestHeaders请求头中,一般存放token 如:{AuthorizationSys: "tokenKey"}) | 根据项目需求设置 |
uploadType | 见 uploadType 配置表 | Object | 文件上传类型控制(如需添加自定义文件类型:请查看 handBeforeUpload(file) {// file.type}) |
# utilsObj 配置表
属性名 | 默认值 | 类型 | 描述 | 是否必填 |
---|---|---|---|---|
isDisabled | false | Boolean | 是否禁用附件上传的功能 | |
fileList | [] | Array | 已经上传的附件列表 | true |
limitNum | 3 | Number | 限制上传的文件数量 (个) | |
fileSize | 50 | Number | 单文件上传大小(MB) | |
typeStyle | 0 | Number | 文件上传的样式控制 (可选值:0(按钮) 1(自定义) | |
isMultiple | false | Boolean | 是否支持同时选择多个文件 | |
btnSize | "medium" | String | 上传按钮的尺寸 如:medium / small / mini | |
btnIcon | "el-icon-upload" | String | 上传按钮展示的图标 | |
btnType | "primary" | String | 上传按钮的样式类型 如:primary / success / warning / danger / info / text | |
btnContent | "上传附件" | String | 上传按钮展示的文字内容 |
# uploadType 配置表
属性名 | 默认值 | 类型 | 描述 | 是否必填 |
---|---|---|---|---|
fileType | ["application/vnd.android.package-archive","application/x-zip-compressed","application/pdf","application/msword","application/vnd.openxmlformats-officedocument.wordprocessingml.document","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",] | Array | 默认可上传的类型 | |
fileName | ["apk","zip","pdf","doc","docx","xls","xlsx"] | Array | 默认可上传的类型对应的后缀名 |
# 事件
事件名 | 参数 | 描述 |
---|---|---|
getFileUploadYt | file | 将处理之后的文件数组传给父组件 |
# 简单使用
<!--
* @Description: 文件上传通用组件的使用 页面
* @Author: mhf
* @Date: 2023/10/27 17:52
-->
<template>
<div>
<ytFileUpload ref="ytFileUpload"
:utilsObj="utilsObj"
:actionUrl="actionUrl"
:uploadType="uploadType"
@getFileUploadYt="getFileUploadYt"
/>
</div>
</template>
<script>
export default {
name: "useYtFileUpload",
components: {},
props: {},
computed: {},
watch: {},
filters: {},
data() {
return {
utilsObj: {
isDisabled: false, // 是否禁用附件上传的功能
fileList: [], // 已经上传的附件列表
limitNum: 3, // 限制上传的文件数量 (个)
fileSize: 50, // 单文件上传大小(MB)
typeStyle: 0, // 文件上传的样式控制
isMultiple: false, // 是否支持同时选择多个文件
btnSize: "medium", // 上传按钮的尺寸 如:medium / small / mini
btnIcon: "el-icon-upload", // 上传按钮展示的图标
btnType: "primary", // 上传按钮的样式类型 如:primary / success / warning / danger / info / text
btnContent: "上传附件", // 上传按钮展示的文字内容
},
actionUrl: "http://127.0.0.1:3002/api/upload",
uploadType: {
fileType: [
"application/pdf",
"application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"application/vnd.ms-excel",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
],
fileName: ["pdf", "doc", "docx", "xls", "xlsx"]
}
};
},
methods: {
getFileUploadYt(data) {
// this.formData.annexUrl = data;
console.log(data);
},
},
created() {
},
mounted() {
},
destroyed() {
},
};
</script>
<style lang="scss" scoped></style>
# 返给父组件的数据/附件回显 的格式类型
[
{
"uid": 1698475119831,
"name": "2023/10/28/eed1d5d890a640b189002987ea03a5e0.zip",
"suffix": ".zip",
"url": "http://192.168.0.254:19000/trend/2023/10/28/eed1d5d890a640b189002987ea03a5e0.zip",
"status": "success"
},
{
"uid": 1698475355339,
"name": "2023/10/28/d5b2c6eef36c48c48c53cf195aea0041.docx",
"suffix": ".docx",
"url": "http://192.168.0.254:19000/trend/2023/10/28/d5b2c6eef36c48c48c53cf195aea0041.docx",
"status": "success"
}
]
# 注意事项
1. 以下数据中,name 和 url 字段是必填的,其他字段选填。
[
{
"uid": 1698475119831,
"name": "2023/10/28/eed1d5d890a640b189002987ea03a5e0.zip",
"suffix": ".zip",
"url": "http://192.168.0.254:19000/trend/2023/10/28/eed1d5d890a640b189002987ea03a5e0.zip",
"status": "success"
},
{
"uid": 1698475355339,
"name": "2023/10/28/d5b2c6eef36c48c48c53cf195aea0041.docx",
"suffix": ".docx",
"url": "http://192.168.0.254:19000/trend/2023/10/28/d5b2c6eef36c48c48c53cf195aea0041.docx",
"status": "success"
}
]
2. 如果在新页面 或者 弹窗中使用该组件,并且需要回显数据的场景中
2.1 beforeDestory/destroyed生命周期钩子中需重置 utilsObj.fileList
2.2 需添加 v-if 使弹窗或新页面 完全卸载,如:
<el-dialog
:visible.sync="visibleFlag"
v-if="visibleFlag">
</el-dialog>
3. 请注意,本组件文件上传成功之后返回的数据格式如下,如遇后端返回的数据格式不是这样请修改 handlePrevie()、handleSuccess()、handleRemove()方法
{
"code": 1,
"message": "操作成功",
"data": {
"name": "2023/10/28/36cbc0d338f94caca2a9c02b2a19ffe2.apk",
"suffix": ".apk",
"url": "http://192.168.0.254:19000/trend/2023/10/28/36cbc0d338f94caca2a9c02b2a19ffe2.apk"
}
}
# 在弹窗中使用
<!--
* @Description: ytFileUpload在弹窗中的使用,并实现数据回显 页面
* @Author: mhf
* @Date: 2023/10/28 19:25
-->
<template>
<el-dialog
:close-on-click-modal="false"
:title="title"
:visible.sync="visibleFlag"
v-if="visibleFlag"
width="900px"
append-to-body
@close="hideDialog"
>
<el-form
ref="form"
:model="formData"
:rules="formRules"
label-width="110px"
>
<el-form-item label="附件 :" prop="annexUrl">
<ytFileUpload :headerObj="headerObj"
:actionUrl="actionUrl"
:utilsObj="utilsObj"
@getFileUploadYt="getFileUploadYt"
/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer" style="text-align: center">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="hideDialog">取 消</el-button>
</div>
</el-dialog>
</template>
<script>
export default {
name: "attachConfigDialog",
dicts: ["sys_annex_type"],
data() {
return {
title: "",
visibleFlag: false,
formData: {
annexUrl: [],
},
headerObj: {
AuthorizationSys: "放在请求头上的token"
},
actionUrl: process.env.VUE_APP_BASE_API + "/tlxx-modules-annex/annexAction/upload",
utilsObj: {
isDisabled: false, // 是否禁用附件上传的功能
fileList: [], // 已经上传的附件列表
limitNum: 2, // 限制上传的文件数量 (个)
fileSize: 50, // 单文件上传大小(MB)
typeStyle: 0, // 文件上传的样式控制
isMultiple: false, // 是否支持同时选择多个文件
btnSize: "medium", // 上传按钮的尺寸 如:medium / small / mini
btnIcon: "el-icon-upload", // 上传按钮展示的图标
btnType: "text", // 上传按钮的样式类型 如:primary / success / warning / danger / info / text
btnContent: "上传附件",
}
};
},
methods: {
hideDialog() {
this.visibleFlag = false;
this.formData = {};
this.$parent.getList();
this.utilsObj.fileList = []; // 关闭弹窗时,清空附件列表
},
showDialog(data) {
this.visibleFlag = true;
this.title = data.title;
if (this.title === "修改项目附件配置") {
this.getDetail(data.data.id);
}
},
/**
* @Interface 详情接口
* @description:
* @author: mhf
* @time: 2023-10-28 19:32:21
**/
getDetail(id) {
function detailInterface() {
} // 模拟请求
detailInterface(id).then((res) => {
if (res.code === 1) {
this.formData = res.data;
this.formData.annexUrl = JSON.parse(res.data.annexUrl);
if (!this.formData.annexUrl) {
this.formData.annexUrl = [];
}
this.utilsObj.fileList = this.formData.annexUrl; // 附件回显
} else {
this.$message.error("获取详情数据失败!");
}
});
},
submitForm() {
function updateProjectAnnex() {
} // 模拟请求
function addProjectAnnex() {
} // 模拟请求
this.$refs.form.validate((valid) => {
if (valid) {
if (this.title === "修改") {
this.formData.annexUrl !== []
? (this.formData.annexUrl = JSON.stringify(
this.formData.annexUrl
))
: (this.formData.annexUrl = []);
updateProjectAnnex(this.formData)
.then((res) => {
if (res.code === 1) {
this.$message.success("修改成功!");
this.hideDialog();
} else {
this.$message.warning(res.message);
}
})
.catch((e) => {
throw e;
});
}
if (this.title === "新增项目附件配置") {
this.formData.annexUrl !== []
? (this.formData.annexUrl = JSON.stringify(
this.formData.annexUrl
))
: (this.formData.annexUrl = []);
addProjectAnnex(this.formData)
.then((res) => {
if (res.code === 1) {
this.$message.success("添加成功!");
this.hideDialog();
} else {
this.$message.warning(res.message);
}
})
.catch((e) => {
throw e;
});
}
} else {
return false;
}
});
},
/**
* @Event 获取组件上传得到的最终文件数组
* @description:
* @author: mhf
* @time: 2023-10-28 19:34:24
**/
getFileUploadYt(e) {
this.formData.annexUrl = e;
console.log(e, "获取到的文件 e")
}
},
destroyed() {
}
};
</script>
<style scoped>
</style>