<?php class AnexoController { // Directorio donde se guardan los anexos (relativo a la raíz del proyecto). const DIR_ANEXOS = 'uploads/anexos/'; const DIR_DOCS = 'uploads/docs/'; public function __construct() { // Crear directorios si no existen foreach ([self::DIR_ANEXOS, self::DIR_DOCS] as $dir) { if (!file_exists($dir)) { mkdir($dir, 0777, true); } } } // ───────────────────────────────────────────────────────────── // FORMULARIO DE CARGA // URL: index.php?controller=Anexo&action=index // Equivale a: anexarDocumento/subefoto.PHP // ───────────────────────────────────────────────────────────── public function index() { $this->verificarSesion(); $msg_ok = $_SESSION['anexo_ok'] ?? ''; $msg_err = $_SESSION['anexo_err'] ?? ''; unset($_SESSION['anexo_ok'], $_SESSION['anexo_err']); include 'views/anexos/subir.php'; } // ───────────────────────────────────────────────────────────── // PROCESAR UPLOAD // URL: index.php?controller=Anexo&action=upload (POST) // Equivale a: anexarDocumento/upload.php // ───────────────────────────────────────────────────────────── public function upload() { $this->verificarSesion(); if (!isset($_FILES['archivo']) || empty($_FILES['archivo']['name'][0])) { $_SESSION['anexo_err'] = 'No se seleccionó ningún archivo.'; header('Location: index.php?controller=Anexo&action=index'); exit(); } $subidos = []; $errores = []; $total = count($_FILES['archivo']['tmp_name']); for ($i = 0; $i < $total; $i++) { if (empty($_FILES['archivo']['name'][$i])) continue; $nombre_original = $_FILES['archivo']['name'][$i]; $tmp = $_FILES['archivo']['tmp_name'][$i]; $error_code = $_FILES['archivo']['error'][$i]; if ($error_code !== UPLOAD_ERR_OK) { $errores[] = "Error al cargar: $nombre_original"; continue; } // Sanitizar nombre: solo letras, números, guion, punto $nombre_limpio = preg_replace('/[^a-zA-Z0-9._\-]/', '_', $nombre_original); $nombre_limpio = basename($nombre_limpio); // Evitar sobreescritura: agregar timestamp si ya existe if (file_exists(self::DIR_ANEXOS . $nombre_limpio)) { $info = pathinfo($nombre_limpio); $nombre_limpio = $info['filename'] . '_' . time() . '.' . ($info['extension'] ?? ''); } $destino_anexos = self::DIR_ANEXOS . $nombre_limpio; $destino_docs = self::DIR_DOCS . $nombre_limpio; if (move_uploaded_file($tmp, $destino_anexos)) { // Copia también a docs/ (comportamiento original) copy($destino_anexos, $destino_docs); $subidos[] = $nombre_limpio; } else { $errores[] = "No se pudo guardar: $nombre_original"; } } if (!empty($subidos)) { $_SESSION['anexo_ok'] = count($subidos) . ' archivo(s) cargado(s) correctamente: ' . implode(', ', $subidos); } if (!empty($errores)) { $_SESSION['anexo_err'] = implode('<br>', $errores); } header('Location: index.php?controller=Anexo&action=index'); exit(); } // ───────────────────────────────────────────────────────────── // VISUALIZAR ANEXOS // URL: index.php?controller=Anexo&action=visualizar // Equivale a: anexarDocumento/VisualizarAnexos.php // ───────────────────────────────────────────────────────────── public function visualizar() { $this->verificarSesion(); $page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1; $itemsPerPage = 30; $dateFilter = $_GET['date'] ?? ''; $searchTerm = $_GET['search'] ?? ''; $directorio = self::DIR_ANEXOS; $allFiles = []; if (file_exists($directorio)) { $archivos = array_diff(scandir($directorio), ['.', '..']); foreach ($archivos as $archivo) { $ruta = $directorio . $archivo; if (!is_file($ruta)) continue; $fileDate = date('Y-m-d', filemtime($ruta)); if ($dateFilter && $fileDate !== $dateFilter) continue; if ($searchTerm && stripos($archivo, $searchTerm) === false) continue; $allFiles[] = [ 'name' => $archivo, 'path' => $ruta, 'date' => $fileDate, 'time' => filemtime($ruta), ]; } usort($allFiles, fn($a, $b) => $b['time'] - $a['time']); } $totalDocuments = count($allFiles); $totalPages = (int)ceil($totalDocuments / $itemsPerPage); $offset = ($page - 1) * $itemsPerPage; $currentPageFiles = array_slice($allFiles, $offset, $itemsPerPage); include 'views/anexos/visualizar.php'; } // ───────────────────────────────────────────────────────────── // ELIMINAR ARCHIVO // URL: index.php?controller=Anexo&action=eliminar&archivo=X // ───────────────────────────────────────────────────────────── public function eliminar() { $this->verificarSesion(); $archivo = basename($_GET['archivo'] ?? ''); if ($archivo && file_exists(self::DIR_ANEXOS . $archivo)) { unlink(self::DIR_ANEXOS . $archivo); // Borrar copia en docs/ si existe if (file_exists(self::DIR_DOCS . $archivo)) unlink(self::DIR_DOCS . $archivo); $_SESSION['anexo_ok'] = "Archivo '$archivo' eliminado."; } else { $_SESSION['anexo_err'] = 'No se encontró el archivo.'; } header('Location: index.php?controller=Anexo&action=visualizar'); exit(); } private function verificarSesion() { if (!isset($_SESSION['DIGITA']) || empty($_SESSION['DIGITA'])) { header('Location: index.php'); exit(); } } } ?>