Un'altra delle operazioni molto frequenti è quella che concerne l'upload di file online. Quando si parla di upload bisogna tenere in considerazione una serie di elementi per il corretto funzionamento dei propri script. Per prima cosa è necessario che il file
php.ini
sia configurato in modo da limitare correttamente le dimensioni dei file da caricare: se nella nostra applicazione è possibile effettuare l'upload di file molto grossi, è necessario modificare la variabile di configurazione max_upload_size
affinché il suo valore sia adatto alla nostra situazione.
In secondo luogo è importante ricordarsi che i form HTML che devono inviare i file devono avere l'attributo enctype impostato a "multipart/form-data", altrimenti i file non saranno inviati correttamente. Infine è bene ricordare che i file caricati non sono salvati all'interno della variabile globale $_POST
ma all'interno di $_FILES
, dalla quale saranno accessibili anche altre informazioni addizionali come il nome del file temporaneo locale in cui è stato salvato il file inviato, le dimensioni del file ed altro.
Vediamo nel dettagli come effettuare l'upload di un file. Prima di tutto creiamo un semplice form HTML che si occuperà di richiedere all'utente l'inserimento di un file:
<html>
<head>
<title>File upload</title>
</head>
<body>
<form method="post" action="testupload.php" enctype="multipart/form-data">
<input type="hidden" name="action" value="upload" />
<label>Carica il tuo file:</label>
<input type="file" name="user_file" />
<br />
<input type="submit" value="Carica online" />
</form>
</body>
</html>
Tengo a precisare che potremmo specificare un campo di input nascosto chiamato MAX_FILE_SIZE avente come valore la dimensione massima in byte del file da caricare. Questo valore, anche se controllato sia dal browser che da PHP, non è comunque sicuro, dato che può essere facilmente aggirato. È buona norma effettuare sempre la validazione dei dati da PHP prima di salvarli o elaborarli per evitare spiacevoli sorprese.
Tornando a noi, passiamo alla creazione del file testupload.php
:
<?php
define("UPLOAD_DIR", "./uploads/");
if(isset($_POST['action']) and $_POST['action'] == 'upload')
{
if(isset($_FILES['user_file']))
{
$file = $_FILES['user_file'];
if($file['error'] == UPLOAD_ERR_OK and is_uploaded_file($file['tmp_name']))
{
move_uploaded_file($file['tmp_name'], UPLOAD_DIR.$file['name']);
}
}
}
?>
Queste poche righe di codice si occupano di controllare che i dati provenienti dalla pagina precedente siano corretti, controllano la validità del file caricato ed effettuano praticamente l'upload salvando i dati ove necessario.
L'array $_FILES
permette di accedere ai seguenti valor:
- name: il nome del file caricato originariamente dall'utente;
- tmp_name: il nome temporaneo del file salvato da PHP in una cartella locale;
- type: il mime type del file (nel caso in cui il browser fornisca questa informazione);
- size: le dimensioni in byte del file;
-
error: un codice numerico che indica l'eventuale errore durante il caricamento del file. Ad ogni numero possibile è associata una delle seguenti costanti:
- UPLOAD_ERR_OK (0): Non vi sono errori, l'upload è stato eseguito con successo;
- UPLOAD_ERR_INI_SIZE (1): Il file inviato eccede le dimensioni specificate nel parametro upload_max_filesize di php.ini;
- UPLOAD_ERR_FORM_SIZE (2): Il file inviato eccede le dimensioni specificate nel parametro MAX_FILE_SIZE del form;
- UPLOAD_ERR_PARTIAL (3): Upload eseguito parzialmente;
- UPLOAD_ERR_NO_FILE (4): Nessun file è stato inviato;
- UPLOAD_ERR_NO_TMP_DIR (6): Mancanza della cartella temporanea;
Con tutte queste informazioni risulta molto semplice analizzare un'operazione di upload e comportarsi di conseguenza. La funzione is_uploaded_file
controlla che un file sia effettivamente uno di quelli caricati dall'utente, mentre move_uploaded_file
effettua fisicamente lo spostamento del file temporaneo nel fiel di destinazione specificato.
Aggiungendo alcuni accorgimenti sulle dimensioni ed impacchettando tutto in una libreria è possibile gestire in modo molto completo il caricamento di file online senza rischiare di incorrere in problemi o malfunzionamenti. Come sempre è importante ricordarsi che il path di destinazione di move_uploaded_file
deve essere un path valido.