Some checks failed
CI / Test (ubuntu-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Lint (ubuntu-latest) (push) Has been cancelled
CI / Lint (windows-latest) (push) Has been cancelled
CI / Check (ubuntu-latest) (push) Has been cancelled
CI / Check (windows-latest) (push) Has been cancelled
CodeQL / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Website on push / Deploy Push Playground Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Docs Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Antd Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Element Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Naive Ftp (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
CI / CI OK (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Issue Close Require / close-issues (push) Has been cancelled
Close stale issues / stale (push) Has been cancelled
116 lines
2.8 KiB
TypeScript
116 lines
2.8 KiB
TypeScript
import {nextTick, ref} from 'vue';
|
|
|
|
import {message} from 'ant-design-vue';
|
|
|
|
export function useFileUpload() {
|
|
const uploadPreview = ref(null);
|
|
const imageInput = ref(null);
|
|
const videoInput = ref(null);
|
|
const currentFileType = ref('');
|
|
|
|
const triggerFileInput = (type) => {
|
|
currentFileType.value = type;
|
|
|
|
nextTick(() => {
|
|
if (type === 'image' && imageInput.value) {
|
|
imageInput.value.value = '';
|
|
imageInput.value.click();
|
|
} else if (type === 'video' && videoInput.value) {
|
|
videoInput.value.value = '';
|
|
videoInput.value.click();
|
|
}
|
|
});
|
|
};
|
|
|
|
const handleFileUpload = (event) => {
|
|
if (!event.target.files || event.target.files.length === 0) return;
|
|
|
|
const file = event.target.files[0];
|
|
|
|
// 确定文件类型
|
|
let detectedType = currentFileType.value;
|
|
if (event.target === imageInput.value) {
|
|
detectedType = 'image';
|
|
} else if (event.target === videoInput.value) {
|
|
detectedType = 'video';
|
|
}
|
|
|
|
// 文件大小检查
|
|
const maxSize =
|
|
detectedType === 'image' ? 10 * 1024 * 1024 : 50 * 1024 * 1024;
|
|
if (file.size > maxSize) {
|
|
const maxSizeMB = maxSize / 1024 / 1024;
|
|
message.error(
|
|
`文件大小超过限制!${detectedType === 'image' ? '图片' : '视频'}最大${maxSizeMB}MB`,
|
|
);
|
|
event.target.value = '';
|
|
return;
|
|
}
|
|
|
|
// 文件类型检查
|
|
const validImageTypes = [
|
|
'image/jpeg',
|
|
'image/jpg',
|
|
'image/png',
|
|
'image/gif',
|
|
'image/webp',
|
|
'image/bmp',
|
|
];
|
|
const validVideoTypes = [
|
|
'video/mp4',
|
|
'video/avi',
|
|
'video/mov',
|
|
'video/wmv',
|
|
'video/flv',
|
|
'video/webm',
|
|
'video/mkv',
|
|
];
|
|
|
|
if (detectedType === 'image' && !validImageTypes.includes(file.type)) {
|
|
message.error('请选择有效的图片格式 (JPEG, PNG, GIF, WebP, BMP)');
|
|
event.target.value = '';
|
|
return;
|
|
}
|
|
|
|
if (detectedType === 'video' && !validVideoTypes.includes(file.type)) {
|
|
message.error(
|
|
'请选择有效的视频格式 (MP4, AVI, MOV, WMV, FLV, WebM, MKV)',
|
|
);
|
|
event.target.value = '';
|
|
return;
|
|
}
|
|
|
|
const reader = new FileReader();
|
|
reader.addEventListener('load', (e) => {
|
|
uploadPreview.value = {
|
|
type: detectedType,
|
|
url: e.target.result,
|
|
name: file.name,
|
|
size: file.size,
|
|
file,
|
|
};
|
|
});
|
|
|
|
reader.onerror = (error) => {
|
|
console.error('文件读取失败:', error);
|
|
message.error('文件读取失败,请重试');
|
|
};
|
|
|
|
reader.readAsDataURL(file);
|
|
event.target.value = '';
|
|
};
|
|
|
|
const cancelUpload = () => {
|
|
uploadPreview.value = null;
|
|
};
|
|
|
|
return {
|
|
uploadPreview,
|
|
imageInput,
|
|
videoInput,
|
|
triggerFileInput,
|
|
handleFileUpload,
|
|
cancelUpload,
|
|
};
|
|
}
|