feat: enhance file upload functionality to support multiple JSON file uploads with improved validation and notification handling

This commit is contained in:
Supra4E8C
2025-12-06 13:16:09 +08:00
parent 86edc1ee95
commit 69f808e180
2 changed files with 55 additions and 27 deletions

View File

@@ -558,7 +558,7 @@
<i class="fas fa-chevron-right"></i> <i class="fas fa-chevron-right"></i>
</button> </button>
</div> </div>
<input type="file" id="auth-file-input" accept=".json" style="display: none;"> <input type="file" id="auth-file-input" accept=".json" multiple style="display: none;">
</div> </div>
</div> </div>

View File

@@ -998,37 +998,65 @@ export const authFilesModule = {
// 处理文件上传 // 处理文件上传
async handleFileUpload(event) { async handleFileUpload(event) {
const file = event.target.files[0]; const input = event?.target;
if (!file) return; const files = Array.from(input?.files || []);
if (input) {
input.value = '';
}
if (!files.length) return;
if (!file.name.endsWith('.json')) { const validFiles = [];
const invalidFiles = [];
files.forEach(file => {
if (file && file.name.endsWith('.json')) {
validFiles.push(file);
} else if (file) {
invalidFiles.push(file.name);
}
});
if (invalidFiles.length) {
this.showNotification(i18n.t('auth_files.upload_error_json'), 'error'); this.showNotification(i18n.t('auth_files.upload_error_json'), 'error');
event.target.value = ''; }
return; if (!validFiles.length) return;
let successCount = 0;
const failed = [];
for (const file of validFiles) {
try {
await this.uploadSingleAuthFile(file);
successCount++;
} catch (error) {
failed.push({ name: file.name, message: error.message });
}
} }
try { if (successCount > 0) {
const formData = new FormData(); this.clearCache();
formData.append('file', file, file.name);
const response = await this.apiClient.requestRaw('/auth-files', {
method: 'POST',
body: formData
});
if (!response.ok) {
const errorData = await response.json().catch(() => ({}));
throw new Error(errorData.error || `HTTP ${response.status}`);
}
this.clearCache(); // 清除缓存
await this.loadAuthFiles(); await this.loadAuthFiles();
this.showNotification(i18n.t('auth_files.upload_success'), 'success'); const suffix = validFiles.length > 1 ? ` (${successCount}/${validFiles.length})` : '';
} catch (error) { this.showNotification(`${i18n.t('auth_files.upload_success')}${suffix}`, failed.length ? 'warning' : 'success');
this.showNotification(`${i18n.t('notification.upload_failed')}: ${error.message}`, 'error'); }
} finally {
// 清空文件输入框,允许重复上传同一文件 if (failed.length) {
event.target.value = ''; const details = failed.map(item => `${item.name}: ${item.message}`).join('; ');
this.showNotification(`${i18n.t('notification.upload_failed')}: ${details}`, 'error');
}
},
async uploadSingleAuthFile(file) {
const formData = new FormData();
formData.append('file', file, file.name);
const response = await this.apiClient.requestRaw('/auth-files', {
method: 'POST',
body: formData
});
if (!response.ok) {
const errorData = await response.json().catch(() => ({}));
throw new Error(errorData.error || `HTTP ${response.status}`);
} }
}, },