Operazioni PHP su file di testo e funzioni che le permettono

Documento di Università su operazioni PHP su file di testo e funzioni che le permettono. Il Pdf illustra la gestione dei file in PHP, con esempi di scrittura e lettura carattere per carattere e dell'intero contenuto, utile per lo studio di Informatica.

Mostra di più

9 pagine

OPERAZIONI IN PHP SUI FILE DI TESTO
E RELATIVE FUNZIONI CHE LE PERMETTONO.
Un operazione di scrittura può essere sinteticamente rappresentata
dal listato PHP:
<?php
// apertura in lettura / scrittura
$fl = fopen("testo.txt","w");
// scrittura sul file (con a capo)
fwrite($fl, "abc\n");
fwrite($fl, "def\n");
fwrite($fl, "ghi\n");
fclose($fl);
?>
se desidero effettuare anche la rilettura dei dati scritti posso ricorrere ad
un ciclo che effettui una lettura di un carattere alla volta:
<?php
// apertura in lettura / scrittura
$fl = fopen("testo.txt","w+");
// scrittura sul file (con a capo)
fwrite($fl, "abc\n");
fwrite($fl, "def\n");
fwrite($fl, "ghi\n");
// rilettura e ristampa dei contenuti
// del file carattere per carattere
rewind($fl);
while (! feof($fl))
{
$ch = fread($fl,1);
if ($ch == "\n") // se è un carattere di a capo metto un <br>
echo "<br>";
else
echo $ch; // altrimenti ristampo il carattere
}
fclose($fl);
?>
In questo caso la lettura viene effettuata in modo classico, come
ripetizione di una serie di operazioni (lettura di singoli caratteri nel caso in
questione), finché tutto il contenuto del file non sia stato letto.
La lettura è possibile dopo aver "riavvolto" il punto di lettura fino all'inizio
del file, tramite la funzione rewind(...).
La fine delle operazioni e quindi del ciclo di lettura viene determinata grazie
alla funzione feof(...), la quale rende il booleano true, se la lettura ha
raggiunto la fine del file, oppure false se la lettura non ha ancora raggiunto il
punto di fine.
La lettura di tutto il contenuto di un file di testo può essere, tramite una
sola operazione, può essere effettuata con il codice:
...
$tutto_testo = fread($fl, filesize("testo.txt"));
....
ossia una operazione read estesa a tutta l'ampiezza del file.
L'ampiezza del file viene individuata tramite la funzione filesize (....) ed in
questo caso l'operazione viene svolta senza ricorrere ad alcun ciclo.
Da notare che la funzione filesize(....) attende come parametro non il
descrittore del file (o file handle che si voglia dire), ma una stringa indicante il
path ed il nome del file stesso.

Visualizza gratis il Pdf completo

Registrati per accedere all’intero documento e trasformarlo con l’AI.

Anteprima

Operazioni PHP sui file di testo

OPERAZIONI IN PHP SUI FILE DI TESTO E RELATIVE FUNZIONI CHE LE PERMETTONO.

Un operazione di scrittura può essere sinteticamente rappresentata dal listato PHP:

<? php // apertura in lettura / scrittura $fl = fopen("testo.txt","w"); // scrittura sul file (con a capo) fwrite($fl, "abc\n"); fwrite($fl, "def\n"); fwrite($fl, "ghi\n"); fclose($fl); ?>

se desidero effettuare anche la rilettura dei dati scritti posso ricorrere ad un ciclo che effettui una lettura di un carattere alla volta:

<? php // apertura in lettura / scrittura $fl = fopen("testo.txt","w+"); // scrittura sul file (con a capo) fwrite($fl, "abc\n"); fwrite($fl, "def\n"); fwrite($fl, "ghi\n"); // rilettura e ristampa dei contenuti // del file carattere per carattere rewind($fl); while (! feof($fl)) { $ch = fread($fl,1); if ($ch == "In") // se è un carattere di a capo metto un <br>echo "<br>"; else echo $ch; // altrimenti ristampo il carattere } fclose($fl); ?>

In questo caso la lettura viene effettuata in modo classico, come ripetizione di una serie di operazioni (lettura di singoli caratteri nel caso in questione), finché tutto il contenuto del file non sia stato letto. La lettura è possibile dopo aver "riavvolto" il punto di lettura fino all'inizio del file, tramite la funzione rewind( ... ). La fine delle operazioni e quindi del ciclo di lettura viene determinata grazie alla funzione feof( ... ), la quale rende il booleano true, se la lettura ha raggiunto la fine del file, oppure false se la lettura non ha ancora raggiunto il punto di fine.

La lettura di tutto il contenuto di un file di testo può essere, tramite una sola operazione, può essere effettuata con il codice: $tutto_testo = fread($fl, filesize("testo.txt")); ossia una operazione read estesa a tutta l'ampiezza del file. L'ampiezza del file viene individuata tramite la funzione filesize ( .... ) ed in questo caso l'operazione viene svolta senza ricorrere ad alcun ciclo. Da notare che la funzione filesize( .... ) attende come parametro non il descrittore del file (o file handle che si voglia dire), ma una stringa indicante il path ed il nome del file stesso.Se invece si vuole effettuare una lettura per linee di testo, il codice da applicare sarà quello seguente:

rewind($fl); while (! feof($fl)) { $linea = fgets($fl); echo $linea . "<br>"; }

si tenga conto che la funzione fgets( ... ) non toglie di default i caratteri di a capo finali dalla stringa letta.

Considerazioni ed esempi sull'upload dei file

CONSIDERAZIONI ED ESEMPI RIGUARDO ALL'UPLOAD DEI FILES. Usualmente il Web essendo una piattaforma nata essenzialmente per la pubblicazione di risorse, testi ed immagini, opera in download, tant'è che spesso le nostre stesse linee di trasmissione dati hanno performance asimmetriche tra upload e download. Ciò non vuol dire che su Web non siano possibili o non abbiano senso operazioni di upload. Si pensi solo, come già detto agli upload effettuati per allegare documenti o altro su mail gestite via Web, oppure spostamenti di pagine e altre risorse verso server che le devono erogare. Proprio per questo è possibile quindi programmare meccanismi che permettono di inviare file sul server che eroga il servizio.

Forma elementare di codifica di un upload

La forma di codifica più elementare di un upload è:

<HTML> <HEAD> <TITLE>Upload di files</TITLE> </HEAD> <BODY><FORM ACTION="upload_facile.php" method="post" enctype="multipart/form- data"> <INPUT TYPE="file" NAME="fl1"><BR><BR> <INPUT TYPE="submit" VALUE="Fai upload"> </FORM> </BODY> </HTML> <? php if ($_FILES['fl1']['error'] == UPLOAD_ERR_OK) { move_uploaded_file($_FILES['fl1']['tmp_name'], "./upload/". $_FILES['fl1']['name']); echo "Il file è stato uplodato."; } else echo "Nessun file uploadato."; ?>

Per effettuare l'upload si utilizza sempre un form HTML in questo caso però con un enctype diverso dall'usuale, vale a dire che mentre l'enctype di default per un form è: enctype="application/x-www-form-urlencoded" nel caso di operazioni di upload l'enctype diviene: enctype="multipart/form-data" inoltre, si deve notare che il metodo obbligatorio in caso di upload di file è il metodo POST. Infine, vi è un terzo elemento di novità, che è quello più evidente, ossia la presenza di un nuovo elemento delle form HTML, indicato con <INPUT TYPE="file" .... > Questo elemento è specifico per le operazioni di upload.Esso serve a selezionare il file che si vuole uploadare (ossia inviare al server) sulla macchina utente (client). Il campo form fa apparire un pulsante atto alla selezione di file (e successivamente alla selezione memorizza in un apposito campo testo il percorso del file selezionato. Il file in seguito al submit con operazione di upload viene trasferito temporaneamente nella solita directory c:\XAMPPItmp, ma per il solo tempo necessario per essere successivamente copiato dallo script della pagina attiva che viene chiamata per gestire ii dati inviati dalla form. Successivamente al funzionamento della pagina PHP successiva, il file temporaneo caricato sul server viene subito rimosso dalla directory Itmp di XAMPP. Il file ha un nome codificato, non corrispondente al file originale, di cui però tramite i meccanismi di upload è possibile comunque conoscere il nome originario. Si rende quindi necessario che lo script PHP per renderlo permanente lo copi in una opportuna posizione.

Recupero dati file con $_FILES

Il recupero dei dati relativi al/ai file oggetto di upload sono recuperate tramite una apposita superglobal detta $_FILES. Essa si comporta non come un vettore, ma bensì come una matrice, dotata di n x 5 elementi. Intanto vi è da considerare che tutti i campi di tipo file presenti nella form dovranno come al solito avere un nome univoco. Per recuperare le informazioni del file nel campo diciamo "fl1" della form dovremo operare con la variabile superglobals $_FILES['fl1']. Essa però non è una variabile semplice, ma a sua volta è composta da cinque sottocampi, che sono:

  • tmp_name - path e nome completo del file temporaneo uploadato
  • size - ampiezza in byte del file oggetto di upload
  • name - nome ed estensione originari del file uplodato
  • error - indicazione di eventuali errori occorsi durante l'upload
  • type - indica seguendo lo standard MIME il tipo di file oggetto dell'upload si tenga presente che l'indicazione dei tipi dei files e relativa indicazione MIME è ampia.Un documento riepilogativo sintetico si trova in: https://developer.mozilla.org/en- US/docs/Web/HTTP/Basics of HTTP/MIME types/Common types.

Generalmente uno script PHP prima di effettuare la copia definitiva del file da uploadare effettuerà una serie di controlli, su dimensione, tipo effettivo del file ed eventuali errori occorsi durante l'operazione. La presenza di stati di errore nell'upload indica in generale che non è possibile effettuare o concludere l'operazione di upload. Per gli altri parametri, spesso potrebbe esserci il vincolo che il file uploadato sia di un determinato tipo o sottotipo (ad esempio image/jpeg), o che la sua dimensione non superi una certa soglia considerata "di sicurezza". Tutte questi controlli vengono fatti tramite i sottocampi error, type e size, del campo file. In pratica quindi potendoci essere più campi file di upload in un singolo form, la superglobals $_FILES diviene in genere una vera e propria matrice.

Esempio di pagina di upload PHP articolata

Una forma più articolata della pagina di upload PHP indicata sopra potrebbe essere:

<? php if ($_FILES['fl1']['error'] == UPLOAD_ERR_OK) { // se il file è del tipo MIME image/ if (strpos($_FILES['fl1']['type'], "image/") === false) echo "Upload di tipo non previsto."; else { // limite massimo previsto del file 3000 byte if ($_FILES['fl1']['size'] > 3000) echo "File di grandezza eccessiva.";else // completa l'upload { move_uploaded_file($_FILES['fl1']['tmp_name'], "./upload/". $_FILES['fl1']['name']); echo "Il file è stato uplodato."; } } } else if ($_FILES['fl1']['error'] == UPLOAD_ERR_NO_FILE) // .... si è dimenticato di selezionare un file echo "Nessun file in upload è indicato."; ?>

La pagina con l'elenco degli errori può essere reperita in: https://www.php.net/manual/en/features.file-upload.errors.php

Definire la grandezza massima di un file uploadabile in HTML

PRIMO MODO DI DEFINIRE LA GRANDEZZA MASSIMA DI UN FILE UPLOADABILE, IMPLEMENTATO IN HTML. Per implementare il limite (stabilire un limite massimo o minimo) si usa un campo hidden con un ben preciso nome, proprio MAX_FILE_SIZE, scritto come qui riportato. Quindi si tratta di un vero e proprio campo della form autonomo da inserire prima dei campi di tipo file per l'upload della form. Questo campo impone un limite di ampiezza ai file da uploadare. C'è da notare che tale metodo di limitazione delle dimensioni dei file uploadati non viene considerato sicuro in quanto è possibile modificare il contenuto della pagina Web. Questa metodica di controllo è analizzata anche nella pagina del manuale PHP: https://www.php.net/manual/en/features.file-upload.post-method.phpCodice con il campo applicato prima, combinato con l'applicazione di due campi di upload che lavorano contemporaneamente in parallelo:

<HTML> <HEAD> <TITLE>Upload di files</TITLE> </HEAD> <BODY> <FORM ACTION="upload_facile.php" method="post" enctype="multipart/form-data"> <!-- campo per definire la massima dimensione di upload per file -- > <input type="hidden" name="MAX_FILE_SIZE" value="2000" /> <INPUT TYPE="file" NAME="fl1"><BR><BR> <INPUT TYPE="file" NAME="fl2"><BR><BR> <INPUT TYPE="submit" VALUE="Fai upload"> </FORM> </BODY> </HTML> <? php if ($_FILES['fl1']['error'] == UPLOAD_ERR_OK) { move_uploaded_file($_FILES['fl1']['tmp_name'], "./upload/". $_FILES['fl1']['name']); echo "file 1 - Il file è stato uplodato .< br>"; } else { if ($_FILES['fl1']['error'] == UPLOAD_ERR_FORM_SIZE) echo "file1 - Il file eccede la grandezza prevista dal campo MAX FILE_SIZE<br>"; else if ($_FILES['fl1']['error'] == UPLOAD_ERR_NO_FILE) echo "file1 - Errore di upload, non hai indicato il file .< br>"; else echo "file1 - Incontrato qualche problema di upload .< br>"; } if ($_FILES['fl2']['error'] == UPLOAD_ERR_OK){ move_uploaded_file($_FILES['fl2']['tmp_name'], "./upload/". $_FILES['fl2']['name']); echo "file 2 - Il file è stato uplodato .< br>"; } else { if ($_FILES['fl2']['error'] == UPLOAD_ERR_FORM_SIZE) echo "file2 - Il file eccede la grandezza prevista dal campo MAX_FILE_SIZE<br>"; else if ($_FILES['fl2']['error'] == UPLOAD_ERR_NO_FILE) echo "file2 - Errore di upload, non hai indicato il file .< br>"; else echo "file2 - Incontrato qualche problema di upload .< br>"; } ?>

Non hai trovato quello che cercavi?

Esplora altri argomenti nella Algor library o crea direttamente i tuoi materiali con l’AI.