<template>
<div>
<a-upload
v-model:file-list="currentFileList"
name="file"
:disabled="disabled"
:max-count="maxCount"
:customRequest="customRequest"
:before-upload="beforeUpload"
@change="change"
>
<a-button v-if="!disabled" :loading="state.upLoading">
上传
<upload-outlined />
</a-button>
</a-upload>
</div>
</template>
<script setup lang="ts" name="nUpload">
import { computed, reactive } from 'vue';
import { uploadFile } from '/@/api/common';
import { message } from 'ant-design-vue';
const props = defineProps({
fileList: {
type: Array,
default: () => []
},
forbidden: {
type: Array,
default: () => []
},
maxCount: {
type: Number,
default: 1
},
disabled: {
type: Boolean,
default: false
},
sysCode: {
type: String,
default: ''
},
modelCode: {
type: String,
default: ''
}
});
const emits = defineEmits(['update:fileList', 'change']);
const state = reactive({
fileArr: [],
upLoading: false
});
const currentFileList = computed({
get: () => props.fileList,
set: val => {
emits('update:fileList', val);
}
});
const customRequest = option => {
const formData = new FormData();
const { file } = option;
formData.append('file', file);
formData.append('sysCode', props.sysCode);
formData.append('modelCode', props.modelCode);
formData.append('publicFlag', '1');
option.onProgress();
state.upLoading = true;
uploadFile(formData)
.then(res => {
state.upLoading = false;
if (res.isSuccess) {
option.onSuccess();
state.fileArr.push({
name: res.data.originalName,
url: res.data.fileUrl
});
emits('update:fileList', state.fileArr);
} else {
option.onError();
}
})
.catch(() => {
state.upLoading = false;
option.onError();
});
};
const beforeUpload = file => {
let isForbidden = false;
props.forbidden.map((it: any) => {
let index = file.name.lastIndexOf('.');
let ext = file.name.substr(index + 1);
if (ext === it) isForbidden = true;
});
if (isForbidden) message.error('请上传正确的文件格式');
return !isForbidden;
};
const filterRefresh = file => {
state.fileArr = state.fileArr.filter(it => {
return it.uid !== file.uid;
});
emits('update:fileList', state.fileArr);
};
const change = ({ file }) => {
if (file.status === 'error') {
message.error('上传失败!');
filterRefresh(file);
} else if (file.status === 'removed') {
message.success('删除成功!');
filterRefresh(file);
} else if (!file.status) {
filterRefresh(file);
}
};
</script>
<style scoped lang="less"></style>