可以限限制上传文件个数
const MAX_FILE_COUNT = 500;
function changeFile(event) {
const files = event.target.files;
if (files.length > MAX_FILE_COUNT) {
alert(`请不要选择超过${MAX_FILE_COUNT}个文件`);
// 可能需要清空文件选择,具体取决于浏览器兼容性
event.target.value = '';
return;
}
// ... 其他文件处理逻辑
}
还可以使用Web Workers
// main.js
const worker = new Worker('worker.js');
worker.postMessage({ action: 'validateFiles', files: event.target.files });
worker.onmessage = (event) => {
if (event.data.action === 'validationResult') {
console.log('Validation result:', event.data.result);
}
};
// worker.js
self.addEventListener('message', (event) => {
switch (event.data.action) {
case 'validateFiles':
const validFiles = event.data.files.filter(validateFile);
self.postMessage({ action: 'validationResult', result: validFiles });
break;
// ...
}
});
function validateFile(file) {
// 文件验证逻辑...
}
还可以分批次上传
async function uploadFilesInBatches(files, batchSize = 100) {
for (let i = 0; i < files.length; i += batchSize) {
const batchFiles = files.slice(i, i + batchSize);
const formData = new FormData();
for (const file of batchFiles) {
formData.append('files', file);
}
await fetch('/api/upload', { method: 'POST', body: formData });
}
}
// 在changeFile事件处理器中调用
uploadFilesInBatches(event.target.files);
懒加载:
先上传文件的基本信息(如名称、大小、类型、路径等),待用户需要查看或进一步操作时再上传实际文件内容。
流式上传:
利用Blob、FileReader的readAsArrayBuffer或第三方库(如Resumable.js)不等待整个文件加载完成。