PHP - Upload file

Novembre 2016

Il linguaggio PHP permette di caricare file su un server tramite un modulo HTML.


Modulo per l'invio di file

La prima cosa da fare consiste nel creare un modulo HTML permettendo all'utente di aprire una finestra di dialogo per scegliere un file da inviare:

<form method="POST" action="[il  file PHP per l'upload.php]" enctype="multipart/form-data">     
<input type="hidden" name="MAX_FILE_SIZE" value="2097152">     
<input type="file" name="nome_del_file">    
<input type="submit" value="Invia">    
</form>


Da non dimenticare assolutamente l'attributo ENCTYPE="multipart/form-data". Se non funziona il modulo non avrà alcun effetto.

Inoltre il campo MAX_FILE_SIZE è l'indicazione della dimensione massima del file da caricare per il browser, ma questo non è sufficiente per assicurarsi che i file caricati non superino la dimensione: il limite è fissato sul computer client (l'utente). Chiunque è in grado di caricare file più grandi tramite un altro modulo senza questo limite. Per ottenere un limite affidabile con non si può aggirare, è necessario impostare un limite nel server, affinché rifiuti file pesanti. Il valore della dimensione massima del file è modificabile nel file di configurazione php.ini sul server.

Configurazione del server PHP per consentire l'upload

Il file di configurazione php.ini del server PHP, contiene delle direttive che permettono d'autorizzare o meno l'invio dei file attraverso un modulo:


file_uploads= On/Off, permette di autorizzare o meno l'invio di file;

upload_tmp_dir = cartella, permette di definire la cartella temporanea per accogliere il file scaricato;

upload_max_filesize = 2M, permette di definire la dimensione massima autorizzata per il file. Se si oltrepassa questo limite, il server invierà un codice di errore;

post_max_size, indica la dimensione massima dei dati inviati da un modulo. Questa direttiva prevale su upload_max_filesize, bisogna dunque assicurarsi di avere post_max_size superiore a upload_max_filesize.

Se non avete acceso alla configurazione (php.ini), potete verificare la configurazione grazie alla funzione phpinfo() :

<?  
  phpinfo();  
?>

Recuperare un file con PHP

Il file, e le informazioni che lo riguardano, sono accessibili attraverso la variabile super-globale $_FILES[]. Per visualizzare il suo contenuto, potete utilizzare lo script seguente:

<pre><?php  print_r($_FILES); ?></pre>


L'output di questo codice sarà della forma seguente:

Array  
(
[nome_del_file] => Array
(
[name] => Lamiabellafoto.jpg
[type] => immagine/jpg
[tmp_name] => percorso_completo_del_file_caricato
[error] => 0
[size] => 1000
)

)


In questo esempio si tratta di un'immagine JPEG di 1 MB.

I campi $_FILES[name], $_FILES[type], $_FILES|error], $_FILES[size] permettono di effettuare dei test sul tipo di file, la sua dimensione, il nome e verificare se ci sono stati errori. Altresì, potete elaborare gli errori nella maniera seguente:

<?php        
if ($_FILES['nome_del_file']['error']) {  
          switch ($_FILES['nome_del_file']['error']){  
                   case 1: // UPLOAD_ERR_INI_SIZE  
                   echo"Il file supera il limite autorizzato dal server (file php.ini) !";  
                   break;  
                   case 2: // UPLOAD_ERR_FORM_SIZE  
                   echo "Il file supera il limite autorizzato nel modulo HTML !");  
                   break;  
                   case 3: // UPLOAD_ERR_PARTIAL  
                   echo "Il caricamento del file è stato interrotto!";  
                   break;  
                   case 4: // UPLOAD_ERR_NO_FILE  
                   echo "Il file caricato ha una dimensione nulla!");
                   break;  
          }  
}  
else {  
 // $_FILES['nome_del_file']['error'] vale a 0 ossia UPLOAD_ERR_OK  
 // che significa che non c'è stato alcun errore   
}  
?>


Grazie alla funzione move_uploaded_files() è possibile trasferire l'immagine dalla cartella temporanea ad una cartella definita:

<?php

if ((isset($_FILES['nome_del_file']['file'])&&($_FILES['nome_del_file']['error'] == UPLOAD_ERR_OK))) {  
$percorso_destinazione = '/var/www/files/';  
move_uploaded_file($_FILES['nome_del_file']['tmp_name'], $percorso_destinazione.$_FILES['nome_del_file']['name']);  
}  
?> 

Potrebbe anche interessarti :
Il documento intitolato « PHP - Upload file » da CCM (it.ccm.net) è reso disponibile sotto i termini della licenza Creative Commons. È possibile copiare, modificare delle copie di questa pagina, nelle condizioni previste dalla licenza, finché questa nota appaia chiaramente.