PHP/Programmazione/File
PHP mette a disposizione numerose funzioni per leggere e/o modificare i file presenti sul server.
Esiste inoltre la possibilità di effettuare l'upload dei file dell'utente sul server stesso.
Aprire e chiudere i file
[modifica | modifica sorgente]Per prima cosa, quando lavoriamo con un file, dobbiamo aprirlo usando la funzione fopen
la cui sintassi è:
fopen(nomefile, modalità);
dove nomefile
è l'indirizzo del file sul server oppure in Internet e modalità
è una stringa che specifica il modo con cui si apre il file. La funzione restituisce un puntatore univoco al file aperto che servirà successivamente per eseguire le funzioni legate alla lettura e alla scrittura del file.
La modalità può essere:
Modalità | Descrizione |
---|---|
r | Apre il file in modalità di sola lettura |
r+ | Apre il file in modalità di lettura e scrittura |
w | Apre il file in modalità di sola scrittura cancellando il contenuto esistente. Se il file non esiste, PHP tenta di crearlo. |
w+ | Apre il file in modalità di scrittura e lettura cancellando il contenuto esistente. Se il file non esiste, PHP tenta di crearlo. |
a | Apre il file in modalità di sola scrittura posizionando il puntatore alla fine del file per l'inserimento. Se il file non esiste, PHP tenta di crearlo. |
a+ | Apre il file in modalità di scrittura e lettura posizionando il puntatore alla fine del file per l'inserimento. Se il file non esiste, PHP tenta di crearlo. |
Ad esempio:
$fp = fopen('/var/www/contatore.txt','w+');
$fp2 = fopen('./contatore.txt','w+');
$fp3 = fopen('http://esempio.it/file.txt','r');
Per indicare la directory corrente, si usa un punto (.). Per salire di un livello nella gerarchia, se ne usano due (..). Ad esempio:
$fp = fopen('./contatore.txt','w+');
Se il server è su sistem Windows, che usa le barre retroverse, sarà necessario commutarle:
$fp = fopen('C:\\data\\file.txt');
Per chiudere un file già aperto usiamo semplicemente la funzione
fclose(puntatore);
Leggere e scrivere un file
[modifica | modifica sorgente]Per leggere un file si usa la funzione fread
la cui sintassi è:
fread(handle, lunghezza)
e legge lunghezza
byte dal file aperto identificato dal puntatore handle
; dopodiché, sposta il puntatore del file di lunghezza
byte in avanti.
Ad esempio:
$fp = fopen("file.txt", "r");
$contenuto = fread($fp, 10);
$cont2= fread($fp, 40);
Con questo breve spezzone, $contenuto
conterrà i primi dieci byte del file e $cont2
i byte dall'undicesimo al cinquantesimo.,
Un'altra funzione utile è fgets
, che funziona come fread
, con la differenza che interrompe la lettura dei dati anche quando incontra un carattere EOF (fine del file) o EOL (fine della riga); questo è utile nell'ambito della lettura di stream input/output.
Per scrivere su un file aperto in modalità di scrittura è possibile usare la funzione fwrite
la cui sintassi è:
fwrite(handle, stringa, n);
e scrive sul file aperto e identificato da handle
i primi n
byte di stringa
. Se stringa
è minore di n
byte, viene scritto il suo contenuto per intero. La funzione restituisce -1 in caso di errore.
Creare un contatore visite
[modifica | modifica sorgente]Viste queste due semplici funzioni, possiamo ora creare un semplice contatore di visite nel nostro sito. Per evitare che il conteggio aumenti ad ogni reload della pagina, useremo delle variabili di sessione per verificare così se l'utente stava già visitando il sito prima di caricare la pagina.
session_start();
if ($_SESSION['entrato'] == false) {
//incrementa le visite se è la prima volta che l'utente accede al sito in questa sessione
$_SESSION['entrato'] = true;
$fp = fopen("contatore.txt", "r+");
if (!$fp) {
//se il file non è stato aperto correttamente
echo "Errore nell'apertura del file";
exit; //esce dallo script PHP
}
$visite = (int) fread($fp, 10);
$visite++;
echo "Questo sito ha avuto $visite visite!";
fwrite($fp, $visite);
fclose($fp);
}
Altre funzioni
[modifica | modifica sorgente]Per la lettura dei file esiste anche la funzione file
la cui sintassi è:
file(nomefile)
e restituisce l'intero contenuto del file nomefile
in un array in cui ciascun elemento è una riga contenente anche il carattere di ritorno a capo. Ad esempio:
$cont = implode("", file("file.txt"));
unisce tutte le righe restituendo quindi l'intero contenuto del file.
Per eliminare i caratteri di ritorno a capo è possibile usare la funzione trim
che restituisce la stringa passata come argomento eliminando gli spazi bianchi agli estremi.
Per leggere un file e metterlo in una stringa basta fare
$contenuto=file_get_contents("nomedelfile");
Per contare le righe di un file si usa:
$righe=count(file("miofile"));
Può risultare inoltre utile la funzione stat
la cui sintassi è:
stat(nome)
e restituisce un array associativo contenente alcune informazione sul file nome
. Tra le chiavi dell'array vi sono:
Chiave | Descrizione |
---|---|
Dev | Numero del dispositivo |
uid e gid | ID dell'utente e del gruppo proprietario |
size | Dimensioni in byte |
atime e mtime | Data dell'ultimo accesso e dell'ultima modifica |
basename(file)
restituisce invece il nome del file passato come argomento:
echo basename('/home/gianni/documento.odt'); //restituisce documento.odt
Caricare file sul server
[modifica | modifica sorgente]PHP mette anche a disposizione, se configurato correttamente, la possibilità di caricare sul server dei file forniti dall'utente. Questo è possibile usando un form HTML che abbia come metodo POST, enctype="multipart/form-data"
e che abbia tra i suoi campi un input con type="file"
.
Prendiamo ad esempio questo spezzone di codice:
<form method="post" enctype="multipart/form-data" action="caricafile.php">
Selezionare il file da caricare: <input type="file" name="file1" />
<input type="submit" value="carica" />
Nel file di destinazione avremo a destinazione un array $_FILES
che conterrà le informazioni sui file caricati per ora in una directory temporanea sul server:
echo "Nome temporaneo del file sul server, assegnato da PHP: ".$_FILES['file1']['tmp_name']; //per esempio /tmp/php-234
echo "<br/>Nome del file sul disco rigido dell'utente: ".$_FILES['file1']['name']; //ad esempio C:\image.png
echo "<br/>Dimensione del file: ".$_FILES['file1']['size']; //ad esempio 2000
echo "<br/>Tipo di file (se fornito dal browser): ".$_FILES['file1']['type']; //per esempio, image/png
echo "<br/>Errore(tipo di errore): ".$_FILES['file1']['error']; //errore 1,2,3,4 utile per la gestione
Si noti che il percorso del file sul server viene assegnato temporaneamente da PHP in una directory impostata nel file di configurazione di PHP.
Per poi copiare definitivamente il file sul server (quello temporaneo viene poi eliminato da PHP alla fine della sessione), usiamo la funzione move_uploaded_file
:
$source = $_FILES['file1']['name'];
$dest = basename($_FILES['file1']['tmp_name']);
move_uploaded_file($source, "archivio/".$dest); //salva il file in una cartella apposita