Gestione dei file in PHP

Da Hacknowledge.

Come in molti altri linguaggi, anche col php si può interagire con i file, le funzioni riguardanti l'apertura e la chiusura di un file sono rispettivamente fopen() e fclose(), per scrivere o leggere invece esistono le funzioni fwrite() e fread().

Indice

[modifica] Aprire e chiudere un file

La funzione fopen() riceve due parametri, il primo corrisponde al nome del file, mentre il secondo al modo in cui aprirlo, quindi:

fopen("nomefile", "modo");

I modi possono essere:

  • w ( write ) - Apre il file per la scrittura, cancella tutto il contenuto del file e posiziona il controllo all'inzio del file. Se il file non esiste verrà creato.
  • w+ - Apre il file per la scrittura e la lettura, cancella tutto il contenuto del file e posiziona il controllo all'inzio del file. Se il file non esiste verrà creato.
  • a ( append )- Apre il file per l'aggiunta di testo, posiziona il controllo alla fine del file. Se il file non esiste verrà creato.
  • a+ - Apre il file per l'aggiunta di testo e per la lettura, posiziona il controllo alla fine del file. Se il file non esiste verrà creato.
  • r ( read ) - Apre il file per la lettura, posiziona il controllo all'inizio del file.
  • r+ - Apre il file per la lettura e la scrittura, posiziona il controllo all'inizio del file.

E' bene però, ogni volta che si apre un file ( Soprattutto nella modalitò r e r+ ), fare dei controlli sul valore di ritorno della funzione fopen, ad esempio:

<?php
   $of = fopen("README.txt", "r");
     if ( $of == NULL ) {
          echo "Il file non esiste, e quindi verrà chiuso.";
          fclose($of);
     }
     else {
          echo "Il file esiste, ed è pronto per essere letto.";
               // ... Altre istruzioni...  
          fclose($of);
     }
?>

Quindi possiamo affermare che quando il valore di ritorno della funzione fopen() è NULL il file non è stato aperto in maniera corretta.

Come si è visto nell'esempio sopra è stata utilizzata la funzione fclose() che riceve solo il puntatore a file ( in questo caso $of ), naturalmente nel PHP possono essere aperti più file contemporaneamente, ma esiste un limite imposto dal sistema in cui gira il programma che può andare da 26 a 64... quindi per ragioni di compatibilità è bene non andare oltre ai 26 file aperti simultaneamente.

[modifica] Leggere e scrivere un file

Come detto precedentemente per scrivere e leggere un file si usano rispettivamente le funzioni fwrite() e fread().
La funzione fwrite() ha la seguente sintassi:

fwrite(puntatore_a_file, testo);

Mentre la sintassi della funzione fread() è:

fread(puntatore_a_file, lunghezza_byte);

La sintassi della prima funzione è abbastanza semplice da capire, il primo parametro è il puntatore a file, cioè la variabile che abbiamo utilizzato nel registrare il valore di ritorno di fopen(), mentre il testo è la stringa che si vuole memorizzare nel file.

La sintassi ivnece della funzione fread() forse è un pò più difficile ( ma ugualmente semplice ) da capire, il primo parametro è sempre il putantore a file mentre il secondo è la lunghezza di byte che si vogliono estrarre dal file.

Facciamo un esempio pratico per capire meglio:

<?php
     $nomefile = "Mio_File.txt";    
 
     if (!($of = fopen($nomefile, "w"))) {
           echo "Il file $nomefile non può essere aperto in modalità scrittura.<br>\n",
                "Probabilmente non si dispone dei permessi necessari.";
           fclose($of);
     }
     else {
             fwrite($of, "Ciao mondo dei file!");
             fclose($of);
             // Ora abbiamo scritto la stringa "Ciao mondo dei file!" All'interno del file..
             // Vediamo di recuperare e stampare a video il contenuto del file in cui abbiamo appena scritto
             if (!($of = fopen($nomefile, "r"))) {
                   echo "Il file $nomefile non può essere aperto in modalità lettura.<br>\n",
                        "Probabilmente non si dispone dei permessi necessari.";
             }
             else {
                      $testo = fread($of, filesize($nomefile));
                      // Come si può vedere nel parametro riguardante la lunghezza abbiamo utilizzato la funzione
                      // filesize(), che restituisce il numero di byte totali del file, quindi abbiamo estratto esattamente
                      // tutto il file, dopodichè il contenuto è stato memorizzato nella variabile $testo.
                      echo "Il contenuto del file è:<br>$testo";
                      fclose($of);
            }
     }
?>

[modifica] Varianti

A queste funzionni esistono però delle varianti, ad esempio al posto di fread() si potrebbe usare la funzione file() che restituisce il contenuto del file in array, ognuno dei quali corrisponde ad una riga ad esempio:

<?php
   $nomefile = "Mio_File.txt";
   $riga = file("leggimi.txt");
 
   echo "La prima riga è: <b>", riga[0], "</b><br>\n",
        "La seconda riga è: <br>", riga[1], "</b><br>\n";
               // Ecc... Ecc... volendo si può anche continuare...
?>

Per contare da quante righe è composto il file si può usare la funzione count() nel seguente modo:

$righe = count(file($nomefile));

Per unire tutte le righe invece si può fare in un modo molto semplice con la funzione implode(), in questo modo:

$testo = implode("", file($nomefile));

[modifica] Caricamento di File sul Server

Per caricare un file sul Server tramite PHP è molto semplice con l'ausilio di un piccolo form HTML che invii con il metodo POST, enctype="multipart/form-data" e che tra i suoi campi abbia un input di type="file". Quindi facciamo l'esempio pratico di come potrebbe venire la pagina HTML con il form per far inviare un file da parte dell'utente.

<html>
<head>
<title>FORM per inviare dei FILE</title>
</head>
<body>
   <form method="POST" enctype="multipart/form-data" action="file.php">
      File da caricare: <input type="file" name="file"><br>
      <input type="submit" value="INVIA FILE">
   </form>
</body>
</html>

A questo punto ci manca la pagina file.php per ricevere il file e depositarlo sul server.

[modifica] $_FILES

Una volta inviato il file, nella pagina *.php ci ritroveremo a disposizione un array $_FILES che conterrà le informazioni sul file caricato, per ora in una directory temporanea sul server. La sintassi di questo array è:

$_FILES[nome_input][info]

Facciamo alcuni esempi:

  • $_FILES['file']['tmp_name'] - il nome temporaneo del file ad esempio: /tmp/php-234
  • $_FILES['file']['name'] - Il nome del file sul disco rigido dell'utente ad esempio: C:\panorama.png
  • $_FILES['file']['size'] - La grandezzza in byte del file ad esempio: 5678
  • $_FILES['file']['type'] - Il tipo del file ( se dato dal browser ) ad esempio: image/png

Bene, ora per copiare definitivamente il file sul server ( perchè quello caricato nella directory temporanea viene eliminato alla fine della sessione ), si può usare la funzione: move_uploaded_file, che ha la seguente sintassi:

move_uploaded_file(sorgente_file, directory_di_destinazione.nome_file_nella_destinazione)

si può usare nell'ultimo parametro la funzione basename() che resistuisce il nome del file, ad esempio basename("C:\prova.png") restituisce prova.png.


Quindi prima di concludere facciamo la pagina finale in php a cui precedentemente sono stati inviati i dati:

<?php
   $sorgente = $_FILES['file']['name'];
   $directory = "archivio/";
   $nome = basename($_FILES['file1']['tmp_name']);
 
   move_uploaded_file($sorgente, $directory.$nome);
?>
Strumenti personali