admin-vben/apps/web-ele/src/views/mp/hooks/useUpload.ts

77 lines
1.6 KiB
TypeScript

import { ElMessage } from 'element-plus';
import { $t } from '#/locales';
export enum UploadType {
Image = 'image',
Video = 'video',
Voice = 'voice',
}
interface UploadTypeConfig {
allowTypes: string[];
maxSizeMB: number;
i18nKey: string;
}
export interface UploadRawFile {
name: string;
size: number;
type: string;
}
const UPLOAD_CONFIGS: Record<UploadType, UploadTypeConfig> = {
[UploadType.Image]: {
allowTypes: [
'image/jpeg',
'image/png',
'image/gif',
'image/bmp',
'image/jpg',
],
maxSizeMB: 2,
i18nKey: 'mp.upload.image',
},
[UploadType.Video]: {
allowTypes: ['video/mp4'],
maxSizeMB: 10,
i18nKey: 'mp.upload.video',
},
[UploadType.Voice]: {
allowTypes: [
'audio/mp3',
'audio/mpeg',
'audio/wma',
'audio/wav',
'audio/amr',
],
maxSizeMB: 2,
i18nKey: 'mp.upload.voice',
},
};
export const useBeforeUpload = (type: UploadType, maxSizeMB?: number) => {
const fn = (rawFile: UploadRawFile): boolean => {
const config = UPLOAD_CONFIGS[type];
const finalMaxSize = maxSizeMB ?? config.maxSizeMB;
// 格式不正确
if (!config.allowTypes.includes(rawFile.type)) {
const typeName = $t(config.i18nKey);
ElMessage.error($t('mp.upload.invalidFormat', [typeName]));
return false;
}
// 大小不正确
if (rawFile.size / 1024 / 1024 > finalMaxSize) {
const typeName = $t(config.i18nKey);
ElMessage.error($t('mp.upload.maxSize', [typeName, finalMaxSize]));
return false;
}
return true;
};
return fn;
};