documentoBase-4-subir archivo

 Para implementar la funcionalidad de subir un archivo y almacenar la ruta correctamente basada en la fecha, necesitas realizar algunos cambios en tu código. Vamos a utilizar move_uploaded_filepara mover el archivo subido a la ruta deseada y mkdirpara crear las carpetas si no existen.

Aquí tienes el código actualizado para la funcionalidad de subir al archivo:



<?php

class Conexion
{
    static public function conectar()
    {
        return new PDO("mysql:host=localhost;dbname=despacho;charset=utf8", "root", "Juzgado-01");
    }
}

class DocumentosModel extends Conexion
{
    static public function casoDocumentos()
    {
        $stmt = Conexion::conectar()->prepare("SELECT * FROM documentos");
        $stmt->execute();
        return $stmt->fetchAll();
    }

    static public function obtenerDocumentos($caso_id)
    {
        $stmt = Conexion::conectar()->prepare("
            SELECT d.*, c.numero_expediente
            FROM documentos d
            JOIN casos c ON d.caso_id = c.id
            WHERE d.caso_id = :caso_id
        ");
        $stmt->bindParam(":caso_id", $caso_id, PDO::PARAM_INT);
        $stmt->execute();
        return $stmt->fetchAll();
    }

    static public function crearDocumento($datos)
    {
        $stmt = Conexion::conectar()->prepare("INSERT INTO documentos (caso_id, tipo_documento, descripcion, fecha, archivo) VALUES (:caso_id, :tipo_documento, :descripcion, :fecha, :archivo)");
        $stmt->bindParam(":caso_id", $datos['caso_id'], PDO::PARAM_INT);
        $stmt->bindParam(":tipo_documento", $datos['tipo_documento'], PDO::PARAM_STR);
        $stmt->bindParam(":descripcion", $datos['descripcion'], PDO::PARAM_STR);
        $stmt->bindParam(":fecha", $datos['fecha'], PDO::PARAM_STR);
        $stmt->bindParam(":archivo", $datos['archivo'], PDO::PARAM_STR);
       
        if ($stmt->execute()) {
            return "success";
        } else {
            return "error";
        }
    }

    static public function actualizarDocumento($datos)
    {
        $stmt = Conexion::conectar()->prepare("UPDATE documentos SET caso_id = :caso_id, tipo_documento = :tipo_documento, descripcion = :descripcion, fecha = :fecha, archivo = :archivo WHERE id = :id");
        $stmt->bindParam(":id", $datos['id'], PDO::PARAM_INT);
        $stmt->bindParam(":caso_id", $datos['caso_id'], PDO::PARAM_INT);
        $stmt->bindParam(":tipo_documento", $datos['tipo_documento'], PDO::PARAM_STR);
        $stmt->bindParam(":descripcion", $datos['descripcion'], PDO::PARAM_STR);
        $stmt->bindParam(":fecha", $datos['fecha'], PDO::PARAM_STR);
        $stmt->bindParam(":archivo", $datos['archivo'], PDO::PARAM_STR);
       
        if ($stmt->execute()) {
            return "success";
        } else {
            return "error";
        }
    }

    static public function eliminarDocumento($id)
    {
        $stmt = Conexion::conectar()->prepare("DELETE FROM documentos WHERE id = :id");
        $stmt->bindParam(":id", $id, PDO::PARAM_INT);
       
        if ($stmt->execute()) {
            return "success";
        } else {
            return "error";
        }
    }
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    switch ($_POST['action']) {
        case 'crear':
            // Procesar la subida del archivo
            if (isset($_FILES['archivo']) && $_FILES['archivo']['error'] === UPLOAD_ERR_OK) {
                $archivoTmpPath = $_FILES['archivo']['tmp_name'];
                $archivoName = $_FILES['archivo']['name'];
                $archivoSize = $_FILES['archivo']['size'];
                $archivoType = $_FILES['archivo']['type'];
               
                // Obtener el año y mes de la fecha
                $fecha = new DateTime($_POST['fecha']);
                $anio = $fecha->format('Y');
                $mes = $fecha->format('m');
               
                // Crear las carpetas si no existen
                $directorio = "pdf/$anio/$mes";
                if (!file_exists($directorio)) {
                    mkdir($directorio, 0777, true);
                }
               
                // Mover el archivo a la carpeta correspondiente
                $destinoPath = "$directorio/$archivoName";
                if (move_uploaded_file($archivoTmpPath, $destinoPath)) {
                    $datos = [
                        "caso_id" => $_POST["caso_id"],
                        "tipo_documento" => $_POST["tipo_documento"],
                        "descripcion" => $_POST["descripcion"],
                        "fecha" => $_POST["fecha"],
                        "archivo" => $destinoPath
                    ];
                    $resultado = DocumentosModel::crearDocumento($datos);
                    if ($resultado === "success") {
                        echo '<script>
                            if (window.history.replaceState) {
                                window.history.replaceState(null, null, window.location.href);
                            }
                            window.location = "documentoBase.php?caso_id=' . $_POST["caso_id"] . '";
                        </script>';
                    } else {
                        echo '<script>
                            if (window.history.replaceState) {
                                window.history.replaceState(null, null, window.location.href);
                            }
                            window.location.reload();
                        </script>';
                    }
                } else {
                    echo "Error al mover el archivo subido.";
                }
            } else {
                echo "Error al subir el archivo.";
            }
            break;
        case 'actualizar':
            $datos = [
                "id" => $_POST["id"],
                "caso_id" => $_POST["caso_id"],
                "tipo_documento" => $_POST["tipo_documento"],
                "descripcion" => $_POST["descripcion"],
                "fecha" => $_POST["fecha"],
                "archivo" => $_POST["archivo"]
            ];
            $resultado = DocumentosModel::actualizarDocumento($datos);
            if ($resultado === "success") {
                echo '<script>
                    if (window.history.replaceState) {
                        window.history.replaceState(null, null, window.location.href);
                    }
                    window.location = "documentoBase.php?caso_id=' . $_POST["caso_id"] . '";
                </script>';
            } else {
                echo '<script>
                    if (window.history.replaceState) {
                        window.history.replaceState(null, null, window.location.href);
                    }
                    window.location.reload();
                </script>';
            }
            break;
        case 'eliminar':
            $resultado = DocumentosModel::eliminarDocumento($_POST['id']);
            if ($resultado === "success") {
                echo '<script>
                    if (window.history.replaceState) {
                        window.history.replaceState(null, null, window.location.href);
                    }
                    window.location = "documentoBase.php?caso_id=' . $_POST["caso_id"] . '";
                </script>';
            } else {
                echo '<script>
                    if (window.history.replaceState) {
                        window.history.replaceState(null, null, window.location.href);
                    }
                    window.location.reload();
                </script>';
            }
            break;
    }
}

if (isset($_GET['caso_id'])) {
    $caso_id = $_GET['caso_id'];
    $documentos = DocumentosModel::obtenerDocumentos($caso_id);
} else {
    die("caso_id no está especificado en la URL.");
}

?>

<div class="container mt-5">
    <h3>Gestión de Documentos</h3>
    <button class="btn btn-success mb-3" data-bs-toggle="modal" data-bs-target="#crearModal">Crear Documento</button>
    <table class="table">
        <thead class="table-dark">
            <tr>
                <th>ID</th>
                <th>Caso ID</th>
                <th>Expediente</th>
                <th>Tipo de Documento</th>
                <th>Descripción</th>
                <th>Fecha</th>
                <th>Archivo</th>
                <th>Acciones</th>
            </tr>
        </thead>
        <tbody>
    <?php foreach ($documentos as $documento) { ?>
        <tr>
            <td><?php echo $documento['id']; ?></td>
            <td><?php echo $documento['caso_id']; ?></td>
            <td><?php echo htmlspecialchars($documento['numero_expediente']); ?></td>
            <td><?php echo $documento['tipo_documento']; ?></td>
            <td><?php echo $documento['descripcion']; ?></td>
            <td><?php echo $documento['fecha']; ?></td>
            <td>
                    <button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#pdfModal-<?php echo $documento['id']; ?>">PDF</button>
                    <!-- Modal PDF -->
                    <div class="modal fade" id="pdfModal-<?php echo $documento['id']; ?>" tabindex="-1" aria-labelledby="pdfModalLabel-<?php echo $documento['id']; ?>" aria-hidden="true">
                        <div class="modal-dialog modal-lg">
                            <div class="modal-content">
                                <div class="modal-header">
                                    <h5 class="modal-title" id="pdfModalLabel-<?php echo $documento['id']; ?>">PDF del Documento</h5>
                                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                                </div>
                                <div class="modal-body">
                                    <div class="embed-responsive embed-responsive-16by9">
                                        <iframe class="embed-responsive-item" src="<?php echo $documento['archivo']; ?>" frameborder="0" style="width:100%; height:600px;"></iframe>
                                    </div>
                                </div>
                                <div class="modal-footer">
                                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
                                </div>
                            </div>
                        </div>
                    </div>
                </td>
            <td>
                <form method="post" style="display: inline-block;">
                    <input type="hidden" name="action" value="eliminar">
                    <input type="hidden" name="id" value="<?php echo $documento['id']; ?>">
                    <input type="hidden" name="caso_id" value="<?php echo $caso_id; ?>">
                    <button type="submit" class="btn btn-danger">Eliminar</button>
                </form>
            </td>
        </tr>
    <?php } ?>
</tbody>
    </table>
</div>

<!-- Modal Crear -->
<div class="modal fade" id="crearModal" tabindex="-1" aria-labelledby="crearModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="crearModalLabel">Crear Documento</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body">
                <form method="post" enctype="multipart/form-data">
                    <input type="hidden" name="action" value="crear">
                    <div class="row">
                        <div class="col-6 mb-3">
                            <label for="caso_id" class="form-label">Caso ID</label>
                            <input type="text" class="form-control" id="caso_id" name="caso_id" value="<?php echo htmlspecialchars($caso_id); ?>" readonly>
                        </div>
                        <div class="col-6 mb-3">
                            <label for="tipo_documento" class="form-label">Tipo de Documento</label>
                            <select class="form-control" id="tipo_documento" name="tipo_documento" required>
                                <option value="Demanda">Demanda</option>
                                <option value="Prueba">Prueba</option>
                                <option value="Sentencia">Sentencia</option>
                                <option value="Notificación">Notificación</option>
                                <option value="Otro">Otro</option>
                            </select>
                        </div>
                        <div class="col-12 mb-3">
                            <label for="descripcion" class="form-label">Descripción</label>
                            <textarea class="form-control" id="descripcion" name="descripcion"></textarea>
                        </div>
                        <div class="col-6 mb-3">
                            <label for="fecha" class="form-label">Fecha</label>
                            <input type="datetime-local" class="form-control" id="fecha" name="fecha" required>
                        </div>
                        <div class="col-6 mb-3">
                            <label for="archivo" class="form-label">Archivo</label>
                            <input type="file" class="form-control" id="archivo" name="archivo">
                        </div>
                    </div>
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
                    <button type="submit" class="btn btn-success">Crear</button>
                </form>
            </div>
        </div>
    </div>
</div>

Comentarios