gtsoft-snail-job-admin/src/components/common/file-upload.vue
opensnail 6d32a839d9 feat(sj_1.0.0_beta3): 新增组导出导入和优化菜单排序
1. 新增组的导入导出
2. 调整定时任务批量和任务管理的顺序
3. 调整工作流任务批量和任务管理的顺序
4. 调整重试场景的顺序
2024-05-27 23:02:30 +08:00

77 lines
1.7 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'
});
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();
})
.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>