浏览代码

se agregan grupos y tamanios de mas tipos de archivo asi como sus validaciones

EmilianoOrtiz 3 月之前
父节点
当前提交
9eaa1a0982
共有 1 个文件被更改,包括 73 次插入7 次删除
  1. 73 7
      sistema-mantenimiento-back/app/Http/Controllers/ValidateLoadArchivesController.php

+ 73 - 7
sistema-mantenimiento-back/app/Http/Controllers/ValidateLoadArchivesController.php

@@ -34,9 +34,50 @@ class ValidateLoadArchivesController extends Controller
     
     // Mapping of file extensions to their types for validation
     private $extensionTypes = [
+        // Archivos de almacenamiento
+        'zip' => 'STORAGE', 'rar' => 'STORAGE', 'tar' => 'STORAGE', '7z' => 'STORAGE',
+        // Formatos de audio
+        'mp3' => 'AUDIO', 'mpeg' => 'AUDIO', 'wav' => 'AUDIO', 'ogg' => 'AUDIO', 'opus' => 'AUDIO',
+        // Archivos de imagen
+        'jpeg' => 'IMG', 'jpg' => 'IMG', 'png' => 'IMG', 'gif' => 'IMG', 'bmp' => 'IMG', 'tiff' => 'IMG', 'svg' => 'IMG',
+        // Archivos de texto
+        'txt' => 'TEXT',
+        // Archivos de video
+        'webm' => 'VIDEO', 'mpeg4' => 'VIDEO', 'mp4' => 'VIDEO', '3gpp' => 'VIDEO', 'mov' => 'VIDEO', 'avi' => 'VIDEO', 'wmv' => 'VIDEO', 'flv' => 'VIDEO',
+        // Planos de Auto CAD
+        'dwg' => 'CAD', 'dxf' => 'CAD',
+        // Modelos de 3D Studio
+        '3ds' => '3D',
+        // Dibujos de Illustrator
+        'ai' => 'ILLUSTRATOR',
+        // Imágenes de Photoshop
+        'psd' => 'PHOTOSHOP',
+        // Formato de documento portátil
         'pdf' => 'PDF',
-        'jpg' => 'IMG', 'jpeg' => 'IMG', 'png' => 'IMG', 'gif' => 'IMG', 'bmp' => 'IMG',
-        'xlsx' => 'EXCEL', 'xls' => 'EXCEL'
+        // Hoja de cálculo en Excel
+        'xls' => 'EXCEL', 'xlsx' => 'EXCEL',
+        // Presentaciones de PowerPoint
+        'ppt' => 'POWERPOINT', 'pptx' => 'POWERPOINT',
+        // Documentos de texto de Word
+        'doc' => 'WORD', 'docx' => 'WORD',
+        // Dibujos de Visio
+        'vsd' => 'VISIO', 'vsdx' => 'VISIO'
+    ];
+    
+    // File size limits in MB by extension
+    private $fileSizeLimits = [
+        // 50MB limit
+        'pdf' => 50, 'doc' => 50, 'docx' => 50, 'vsd' => 50, 'vsdx' => 50,
+        // 75MB limit
+        'xls' => 75, 'xlsx' => 75,
+        // 100MB limit
+        'ppt' => 100, 'pptx' => 100,
+        // 250MB limit (default for all others)
+        'zip' => 250, 'rar' => 250, 'tar' => 250, '7z' => 250,
+        'mp3' => 250, 'mpeg' => 250, 'wav' => 250, 'ogg' => 250, 'opus' => 250,
+        'jpeg' => 250, 'jpg' => 250, 'png' => 250, 'gif' => 250, 'bmp' => 250, 'tiff' => 250, 'svg' => 250,
+        'txt' => 250, 'webm' => 250, 'mpeg4' => 250, 'mp4' => 250, '3gpp' => 250, 'mov' => 250, 'avi' => 250, 'wmv' => 250, 'flv' => 250,
+        'dwg' => 250, 'dxf' => 250, '3ds' => 250, 'ai' => 250, 'psd' => 250
     ];
 
     public function __construct()
@@ -102,13 +143,19 @@ class ValidateLoadArchivesController extends Controller
         Log::info('✓ Archivo ZIP válido');
 
         // Compare Excel file listings with ZIP contents
-        Log::info('Paso 5: Comparando listados Excel vs ZIP');
+        Log::info('Paso 5: Comparando listados Excel vs ZIP y validando tamaños');
         $comparison = $this->compareExcelWithZip($filesValidation['files'], $request->file('zip_file'));
         
+        // Check for file size validation errors
+        if (isset($comparison['error'])) {
+            Log::error('Error en validación de tamaños: ' . $comparison['error']);
+            return $this->responseController->makeResponse(true, $comparison['error'], [], 400);
+        }
+        
         Log::info('✓ Comparación completada', [
             'valid' => $comparison['valid'],
-            'missing_in_zip' => count($comparison['missing_in_zip']),
-            'extra_in_zip' => count($comparison['extra_in_zip'])
+            'missing_in_zip' => count($comparison['missing_in_zip'] ?? []),
+            'extra_in_zip' => count($comparison['extra_in_zip'] ?? [])
         ]);
         
         // Upload temp files if validation is successful
@@ -253,9 +300,10 @@ class ValidateLoadArchivesController extends Controller
         $zip = new ZipArchive();
         $zip->open($zipFile->getPathname());
         
-        // Extract all file names from ZIP
+        // Extract all file names and sizes from ZIP
         Log::info('  - Extrayendo nombres de archivos del ZIP');
         $zipFiles = [];
+        $zipFileSizes = [];
         for ($i = 0; $i < $zip->numFiles; $i++) {
             $fullPath = $zip->getNameIndex($i);
             
@@ -264,15 +312,33 @@ class ValidateLoadArchivesController extends Controller
                 continue;
             }
             
-            // Extract only filename without path
+            // Extract filename and size
             $fileName = basename($fullPath);
             if (!empty($fileName)) {
                 $zipFiles[] = $fileName;
+                $zipFileSizes[$fileName] = $zip->statIndex($i)['size'];
             }
         }
         $zip->close();
         Log::info('  - ZIP contiene ' . count($zipFiles) . ' archivos (excluyendo directorios)');
         
+        // Validate file sizes
+        Log::info('  - Validando tamaños de archivos');
+        foreach ($zipFileSizes as $fileName => $size) {
+            $extension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
+            if (isset($this->fileSizeLimits[$extension])) {
+                $limitMB = $this->fileSizeLimits[$extension];
+                $limitBytes = $limitMB * 1024 * 1024;
+                if ($size > $limitBytes) {
+                    $sizeMB = round($size / (1024 * 1024), 2);
+                    return [
+                        'valid' => false,
+                        'error' => "El archivo '{$fileName}' excede el límite de tamaño. Tamaño: {$sizeMB}MB, Límite: {$limitMB}MB"
+                    ];
+                }
+            }
+        }
+        
         // Get file names from Excel listings
         $excelFileNames = array_column($excelFiles, 'file_name');
         Log::info('  - Excel lista ' . count($excelFileNames) . ' archivos');