Gestió de PDF: diferència entre les revisions

De Wiki personal d'en Guillem Serrat
Cap resum de modificació
Cap resum de modificació
 
(Hi ha 2 revisions intermèdies que no es mostren del mateix usuari)
Línia 1: Línia 1:
__FORCETOC__
== Emmagatzematge de PDF al servidor ==
== Emmagatzematge de PDF al servidor ==
En l’alta d’un usuari s’ha de gestionar l’emmagatzematge d’un fitxer PDF. Aquest fitxer es desa en format binari a la base de dades però també dins del servidor en un directori específic.
En l’alta d’un usuari s’ha de gestionar l’emmagatzematge d’un fitxer PDF. Aquest fitxer es desa en format binari a la base de dades però també dins del servidor en un directori específic.
Línia 30: Línia 32:


== Descàrrega de PDF ==
== Descàrrega de PDF ==
Per descarregar un PDF, es crida al fitxer descarregarPDF.php, indicant un ID, que identifica l'usuari del qual volem obtenir el PDF
<pre>
echo '<a href="../php/descarregarPDF.php?id=' . $fila['id'] . '" target="_blank" class="styled-button">Descarregar PDF</a>';
// La pàgina rebrà el paràmetre ID amb valor $fila['id'], és a dir, la ID del registre de la BD
// " target="_blank" indica que s'obrirà en una nova pàgina
</pre>
Dins del codi descarregarPDF.php trobem:<pre>
<?php
require_once "../php/connexioR.php";
require_once "funcions.php";
if (isset($_GET['id']) == false ) { // En cas que no s'hagi especificat la ID a consultaUsuari.php
    die("No s'ha indicat cap usuari.");
}
$id = intval($_GET['id']); // Converteix la ID a numero enter
try {
    $stmt = $conn->prepare("SELECT nom, cognoms, arxiu FROM Usuaris WHERE id = :id"); // Definim una consulta, on definim que l'ID és in paràmetre enllaçat
    $stmt->bindParam(':id', $id, PDO::PARAM_INT); // Assignem el paràmetre enllaçat ID segons la ID que ens ha ofert consultaUsuari.php
    $stmt->execute(); // Executem la consulta
    $fila = $stmt->fetch(PDO::FETCH_ASSOC); // Recupera tots els registres (files) que retorna la consulta
    // PDO::FETCH_ASSOC fa que cada fila es retorni com una array associativa, on les claus són els noms de les columnes
    if (!$fila || empty($fila['arxiu'])) { // En cas que no s'hagi retornat cap resultat a la consulta (la ID no era correcte) o en el registre no hi a cap PDF pujat
        die("No s'ha trobat cap arxiu."); // (Die) Acaba l'script (no continua amb el codi)
    }
    $nomFitxer = tractarCadena($fila['nom'] . '_' . $fila['cognoms'] . ".pdf");
    // Headers per forçar descàrrega
    header('Content-Type: application/pdf'); // Indiquem al navegador que el que ve és un fitxer PDF (perque enlloc de mostrar-lo com text, el descarregui)
    header('Content-Disposition: attachment; filename="' . $nomFitxer . '"'); // Indica que el fitxer no s'ha d'obrir al navegador, sinó descarregar-se
    header('Content-Length: ' . strlen($fila['arxiu'])); // Informa al navegador la mida de l'arxiu (pel progrés de descàrrega)
    echo $fila['arxiu']; // Mostra el fitxer PDF, el navegador, enlloc de mostrar el binari de l'arxiu, el descarrega.
} catch (PDOException $e) {
    die("Error amb la base de dades: " . $e->getMessage());
}
</pre>


== Eliminació de PDF ==
== Eliminació de PDF ==
Cada cop que un usuari s’elimina, el seu directori també ho ha de fer. Dins del fitxer esborrarConfirmar.php es treballa l’eliminació del directori de l’usuari.<pre>
// Eliminem la carpeta i el PDF de l'usuari del servidor
// Després d'esborrar l'usuari de la BBDD:
$carpetaBase = "/var/www/html/php/exercicis/pj_php_mariadb/pdf/";
$carpetaUsuari = $carpetaBase . strtoupper(trim($usuari['numeroDocument']));
if (is_dir($carpetaUsuari)) { // En cas que la carpeta existeixi
// Borrem tots els fitxers dins la carpeta
// glob() és una funció de PHP la qual busca totes les rutes que coincideixin amb un patró determinat
      $fitxers = glob($carpetaUsuari . "/*"); // agafa tots els fitxers
      foreach ($fitxers as $fitxer) { // Per cada fitxer
          unlink($fitxer); // L'esborra
      }
      // Borrem la carpeta buida, ja que plena no la pot esborrar
      rmdir($carpetaUsuari);
}
</pre>

Revisió de 22:49, 8 des 2025


Emmagatzematge de PDF al servidor

En l’alta d’un usuari s’ha de gestionar l’emmagatzematge d’un fitxer PDF. Aquest fitxer es desa en format binari a la base de dades però també dins del servidor en un directori específic.

Per desar els fitxers PDF dels usuaris al servidor es crea una carpeta de nom el seu número de document i es desa allà el seu PDF.

// Desem el fitxer PDF dins d'un directori del servidor
            
$rutaBase = "/var/www/html/php/exercicis/pj_php_mariadb/pdf/"; // Definim la ruta on es desaran tots els PDF dels usuaris

$carpetaUsuari = $rutaBase . $_POST["numero_document"]; // Definim la ruta on es guardara el PDF d'un usuari en concret

if (!file_exists($carpetaUsuari)) { // Si la carpeta no existeix
    mkdir($carpetaUsuari, 0775, true); // La creem amb els següents permissos de forma recursiva
}

// Assigno el nom del PDF sense espais i tot en minúscula
$nomFinalPDF = tractarCadena($_POST["nom"]. "_" . $_POST["cognoms"] . ".pdf");

// Definim la ruta final 
$rutaFinal = $carpetaUsuari . "/" . $nomFinalPDF;

move_uploaded_file($_FILES['fitxer']['tmp_name'], $rutaFinal); // Movem el fitxer a la ruta indicada

Amb dos usuaris creats, el directori PDF té el següent aspecte:

S'ha produït un error en crear la miniatura: Fitxer inexistent

I el fitxer PDF de Juan Lázaro Trianni tindria el següent nom:

S'ha produït un error en crear la miniatura: Fitxer inexistent


Descàrrega de PDF

Per descarregar un PDF, es crida al fitxer descarregarPDF.php, indicant un ID, que identifica l'usuari del qual volem obtenir el PDF

echo '<a href="../php/descarregarPDF.php?id=' . $fila['id'] . '" target="_blank" class="styled-button">Descarregar PDF</a>';
// La pàgina rebrà el paràmetre ID amb valor $fila['id'], és a dir, la ID del registre de la BD
// " target="_blank" indica que s'obrirà en una nova pàgina


Dins del codi descarregarPDF.php trobem:

<?php
require_once "../php/connexioR.php";
require_once "funcions.php";

if (isset($_GET['id']) == false ) { // En cas que no s'hagi especificat la ID a consultaUsuari.php
    die("No s'ha indicat cap usuari.");
}

$id = intval($_GET['id']); // Converteix la ID a numero enter

try {
    $stmt = $conn->prepare("SELECT nom, cognoms, arxiu FROM Usuaris WHERE id = :id"); // Definim una consulta, on definim que l'ID és in paràmetre enllaçat
    $stmt->bindParam(':id', $id, PDO::PARAM_INT); // Assignem el paràmetre enllaçat ID segons la ID que ens ha ofert consultaUsuari.php
    $stmt->execute(); // Executem la consulta
    $fila = $stmt->fetch(PDO::FETCH_ASSOC); // Recupera tots els registres (files) que retorna la consulta
    // PDO::FETCH_ASSOC fa que cada fila es retorni com una array associativa, on les claus són els noms de les columnes

    if (!$fila || empty($fila['arxiu'])) { // En cas que no s'hagi retornat cap resultat a la consulta (la ID no era correcte) o en el registre no hi a cap PDF pujat
        die("No s'ha trobat cap arxiu."); // (Die) Acaba l'script (no continua amb el codi)
    }

    $nomFitxer = tractarCadena($fila['nom'] . '_' . $fila['cognoms'] . ".pdf");

    // Headers per forçar descàrrega
    header('Content-Type: application/pdf'); // Indiquem al navegador que el que ve és un fitxer PDF (perque enlloc de mostrar-lo com text, el descarregui)
    header('Content-Disposition: attachment; filename="' . $nomFitxer . '"'); // Indica que el fitxer no s'ha d'obrir al navegador, sinó descarregar-se
    header('Content-Length: ' . strlen($fila['arxiu'])); // Informa al navegador la mida de l'arxiu (pel progrés de descàrrega)

    echo $fila['arxiu']; // Mostra el fitxer PDF, el navegador, enlloc de mostrar el binari de l'arxiu, el descarrega.

} catch (PDOException $e) {
    die("Error amb la base de dades: " . $e->getMessage());
}

Eliminació de PDF

Cada cop que un usuari s’elimina, el seu directori també ho ha de fer. Dins del fitxer esborrarConfirmar.php es treballa l’eliminació del directori de l’usuari.

// Eliminem la carpeta i el PDF de l'usuari del servidor
// Després d'esborrar l'usuari de la BBDD:
$carpetaBase = "/var/www/html/php/exercicis/pj_php_mariadb/pdf/";
$carpetaUsuari = $carpetaBase . strtoupper(trim($usuari['numeroDocument']));

if (is_dir($carpetaUsuari)) { // En cas que la carpeta existeixi
// Borrem tots els fitxers dins la carpeta
// glob() és una funció de PHP la qual busca totes les rutes que coincideixin amb un patró determinat
      $fitxers = glob($carpetaUsuari . "/*"); // agafa tots els fitxers
      foreach ($fitxers as $fitxer) { // Per cada fitxer
           unlink($fitxer); // L'esborra
      }
      // Borrem la carpeta buida, ja que plena no la pot esborrar
      rmdir($carpetaUsuari);
}