gtsoft-snail-job-admin/src/components/common/file-upload.vue

84 lines
1.8 KiB
Vue

<script setup lang="ts">
import type { UploadCustomRequestOptions, UploadFileInfo } from 'naive-ui';
import { request } from '@/service/request';
import { $t } from '@/locales';
defineOptions({
name: 'FileUpload'
});
const emit = defineEmits<Emits>();
interface Emits {
(e: 'refresh'): void;
}
interface Props {
accept?: string;
action?: string;
}
defineProps<Props>();
const beforeUpload = (fileData: { file: UploadFileInfo; fileList: UploadFileInfo[] }) => {
if (fileData.file.file?.type !== 'application/json') {
window.$message?.error($t('common.checkUploadType'));
return false;
}
return true;
};
const handleImport = ({
file,
data: uploadData,
headers,
withCredentials,
action,
onFinish,
onError,
onProgress
}: UploadCustomRequestOptions) => {
const formData = new FormData();
if (uploadData) {
Object.keys(uploadData).forEach(key => {
formData.append(key, uploadData[key as keyof UploadCustomRequestOptions['data']]);
});
}
formData.append('file', file.file as File);
request<string>({
url: action,
method: 'post',
data: formData,
withCredentials,
headers: headers as Record<string, string>,
onUploadProgress: ({ progress }) => {
onProgress({ percent: Math.ceil(progress!) });
}
})
.then(() => {
onFinish();
emit('refresh');
})
.catch(() => onError());
};
</script>
<template>
<NUpload
:action="action"
:accept="accept"
:custom-request="handleImport"
:show-file-list="false"
@before-upload="beforeUpload"
>
<NButton size="small" ghost type="primary">
<template #icon>
<IconPajamasImport class="text-icon" />
</template>
{{ $t('common.import') }}
</NButton>
</NUpload>
</template>
<style scoped lang="scss"></style>