|
@@ -34,9 +34,50 @@ class ValidateLoadArchivesController extends Controller
|
|
|
|
|
|
|
|
// Mapping of file extensions to their types for validation
|
|
// Mapping of file extensions to their types for validation
|
|
|
private $extensionTypes = [
|
|
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',
|
|
'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()
|
|
public function __construct()
|
|
@@ -102,13 +143,19 @@ class ValidateLoadArchivesController extends Controller
|
|
|
Log::info('✓ Archivo ZIP válido');
|
|
Log::info('✓ Archivo ZIP válido');
|
|
|
|
|
|
|
|
// Compare Excel file listings with ZIP contents
|
|
// 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'));
|
|
$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', [
|
|
Log::info('✓ Comparación completada', [
|
|
|
'valid' => $comparison['valid'],
|
|
'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
|
|
// Upload temp files if validation is successful
|
|
@@ -253,9 +300,10 @@ class ValidateLoadArchivesController extends Controller
|
|
|
$zip = new ZipArchive();
|
|
$zip = new ZipArchive();
|
|
|
$zip->open($zipFile->getPathname());
|
|
$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');
|
|
Log::info(' - Extrayendo nombres de archivos del ZIP');
|
|
|
$zipFiles = [];
|
|
$zipFiles = [];
|
|
|
|
|
+ $zipFileSizes = [];
|
|
|
for ($i = 0; $i < $zip->numFiles; $i++) {
|
|
for ($i = 0; $i < $zip->numFiles; $i++) {
|
|
|
$fullPath = $zip->getNameIndex($i);
|
|
$fullPath = $zip->getNameIndex($i);
|
|
|
|
|
|
|
@@ -264,15 +312,33 @@ class ValidateLoadArchivesController extends Controller
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // Extract only filename without path
|
|
|
|
|
|
|
+ // Extract filename and size
|
|
|
$fileName = basename($fullPath);
|
|
$fileName = basename($fullPath);
|
|
|
if (!empty($fileName)) {
|
|
if (!empty($fileName)) {
|
|
|
$zipFiles[] = $fileName;
|
|
$zipFiles[] = $fileName;
|
|
|
|
|
+ $zipFileSizes[$fileName] = $zip->statIndex($i)['size'];
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
$zip->close();
|
|
$zip->close();
|
|
|
Log::info(' - ZIP contiene ' . count($zipFiles) . ' archivos (excluyendo directorios)');
|
|
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
|
|
// Get file names from Excel listings
|
|
|
$excelFileNames = array_column($excelFiles, 'file_name');
|
|
$excelFileNames = array_column($excelFiles, 'file_name');
|
|
|
Log::info(' - Excel lista ' . count($excelFileNames) . ' archivos');
|
|
Log::info(' - Excel lista ' . count($excelFileNames) . ' archivos');
|