Gestió de PDF: diferència entre les revisions
Es crea la pàgina amb «== 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. <pre> // Desem el fitxer PDF dins d'un directori del servidor $rutaBase = "/va...». |
Cap resum de modificació |
||
| (Hi ha 5 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 13: | Línia 15: | ||
if (!file_exists($carpetaUsuari)) { // Si la carpeta no existeix | if (!file_exists($carpetaUsuari)) { // Si la carpeta no existeix | ||
mkdir($carpetaUsuari, 0775, true); // La creem amb els següents permissos de forma recursiva | 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 | |||
</pre>Amb dos usuaris creats, el directori PDF té el següent aspecte: | </pre>Amb dos usuaris creats, el directori PDF té el següent aspecte: | ||
[[Fitxer:Image1.png|miniatura|center|500x500px]] | |||
I el fitxer PDF de Juan Lázaro Trianni tindria el següent nom: | |||
[[Fitxer:Image.png|center|miniatura|500x500px]] | |||
== 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:
I el fitxer PDF de Juan Lázaro Trianni tindria el següent nom:
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);
}