Skip to content
This repository was archived by the owner on Dec 14, 2025. It is now read-only.

Commit 3446509

Browse files
committed
feat(upload): Implement file size validation and streamline upload process for multiple files
1 parent 41ca4e0 commit 3446509

File tree

1 file changed

+38
-93
lines changed
  • src/app/dashboard/app/[identifier]

1 file changed

+38
-93
lines changed

src/app/dashboard/app/[identifier]/page.tsx

Lines changed: 38 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -581,111 +581,56 @@ export default function ServerDetailsPage() {
581581
const files = event.target.files;
582582
if (!files || !accessKey) return;
583583

584-
try {
585-
setUploadProgress(0);
586-
setFilesError(null); // Clear any previous errors
587-
588-
// Get upload URL
589-
const urlResult = await getUploadUrl(identifier, accessKey, currentPath);
590-
if (!urlResult.success || !urlResult.data) {
591-
throw new Error(typeof urlResult.error === 'string' ? urlResult.error : "Erro ao obter URL de upload");
584+
// Checagem de tamanho de arquivo (100MB = 104857600 bytes)
585+
for (let i = 0; i < files.length; i++) {
586+
if (files[i].size > 104857600) {
587+
setFilesError(`O arquivo "${files[i].name}" excede o limite de 100MB.`);
588+
return;
592589
}
590+
}
593591

594-
// Upload each file individually with proper progress tracking
595-
for (let i = 0; i < files.length; i++) {
596-
const file = files[i];
597-
console.log(`Starting upload for ${file.name} (${i + 1}/${files.length})`);
598-
599-
// Update progress to show current file
600-
const baseProgress = (i / files.length) * 100;
601-
setUploadProgress(baseProgress);
592+
try {
593+
setUploadProgress(0);
594+
setFilesError(null);
595+
596+
// Monta o FormData para múltiplos arquivos
597+
const formData = new FormData();
598+
formData.append('server_identifier', identifier);
599+
formData.append('directory', currentPath || '/');
600+
for (let i = 0; i < files.length; i++) {
601+
formData.append('files[]', files[i]);
602+
}
602603

603-
try {
604-
const formData = new FormData();
605-
formData.append('files', file);
606-
607-
const response = await fetch(urlResult.data.url, {
608-
method: 'POST',
609-
mode: 'cors',
610-
credentials: 'omit',
611-
body: formData,
612-
});
613604

614-
if (response.ok) {
615-
console.log(`✅ Upload successful for ${file.name}`);
616-
// Update progress to completion for this file
617-
setUploadProgress(((i + 1) / files.length) * 100);
618-
} else {
619-
// Handle HTTP errors
620-
let httpErrorMessage = `Erro HTTP ${response.status} ao fazer upload de ${file.name}`;
621-
try {
622-
const errorData = await response.json();
623-
httpErrorMessage = typeof errorData.message === 'string' ? errorData.message : httpErrorMessage;
624-
} catch {
625-
httpErrorMessage = `HTTP ${response.status}: ${response.statusText}`;
626-
}
627-
throw new Error(httpErrorMessage);
628-
}
605+
// Usa a URL da API do .env
606+
const apiUrl = process.env.NEXT_PUBLIC_API_URL || '';
607+
const uploadUrl = apiUrl.replace(/\/$/, '') + '/v1/files/upload';
608+
const response = await fetch(uploadUrl, {
609+
method: 'POST',
610+
body: formData,
611+
});
629612

630-
} catch (fetchError: any) {
631-
// Check if this is a network error that indicates the upload might have succeeded
632-
if (fetchError.message &&
633-
(fetchError.message.includes('NetworkError') ||
634-
fetchError.message.includes('Failed to fetch') ||
635-
fetchError.message.includes('CORS'))) {
636-
637-
console.log(`⚠️ Network/CORS error for ${file.name} - checking if upload was successful...`);
638-
639-
// Wait a moment and refresh file list to check if file was uploaded
640-
await new Promise(resolve => setTimeout(resolve, 2000));
641-
642-
try {
643-
// Get fresh file list from server
644-
const freshResult = await getServerFiles(identifier, accessKey, currentPath);
645-
if (freshResult.success && freshResult.data) {
646-
// Check if the file now exists in the fresh server list
647-
const fileExists = freshResult.data.some(serverFile => serverFile.name === file.name);
648-
649-
if (fileExists) {
650-
console.log(`✅ File ${file.name} was actually uploaded successfully despite network error`);
651-
// Update local state with fresh data
652-
setServerFiles(freshResult.data);
653-
setUploadProgress(((i + 1) / files.length) * 100);
654-
continue; // Move to next file
655-
} else {
656-
console.error(`❌ Upload failed for ${file.name}:`, fetchError.message);
657-
console.log(`❌ File ${file.name} was not found on server after network error`);
658-
}
659-
}
660-
} catch (checkError) {
661-
console.error(`❌ Upload failed for ${file.name}:`, fetchError.message);
662-
console.log(`❌ Failed to verify upload for ${file.name}:`, checkError);
663-
}
664-
665-
// If we get here, the upload truly failed or we couldn't verify it
666-
console.log(`🚨 Treating as genuine upload failure for ${file.name}`);
667-
throw new Error(`Erro de rede ao fazer upload de ${file.name}. Verifique sua conexão e tente novamente.`);
668-
} else {
669-
// Other types of errors - log immediately
670-
console.error(`❌ Upload failed for ${file.name}:`, fetchError.message);
671-
throw new Error(`Erro ao fazer upload de ${file.name}: ${fetchError.message}`);
672-
}
673-
}
613+
if (response.ok) {
614+
setUploadProgress(100);
615+
await fetchFiles(currentPath);
616+
setUploadProgress(null);
617+
console.log('🎉 Upload concluído com sucesso');
618+
} else {
619+
let errorMessage = `Erro HTTP ${response.status} ao fazer upload.`;
620+
try {
621+
const errorData = await response.json();
622+
errorMessage = errorData?.error || errorMessage;
623+
} catch {}
624+
setFilesError(errorMessage);
625+
setUploadProgress(null);
674626
}
675-
676-
// Final refresh and cleanup
677-
await fetchFiles(currentPath);
678-
setUploadProgress(null);
679-
680-
console.log('🎉 All uploads completed successfully');
681-
682627
} catch (err: any) {
683628
const errorMessage = typeof err === 'string' ? err : (err?.message || "Erro ao fazer upload");
684629
setFilesError(errorMessage);
685630
setUploadProgress(null);
686631
console.error('Upload error:', err);
687632
}
688-
633+
689634
// Reset input
690635
if (event && event.target) {
691636
(event.target as HTMLInputElement).value = '';

0 commit comments

Comments
 (0)