File "AnexoController.php"
Full Path: C:/wamp64/www/AVIDOTAPP/controllers/AnexoController.php
File size: 7.1 KB
MIME-type: text/x-php
Charset: utf-8
<?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();
}
}
}
?>