Dato che, nonostante la mia gratificante qualifica di impiegato amministrativo, in ufficio faccio di tutto, e dato che molto di questo tutto lo faccio aggatis, perchè non renderlo disponibile a tutti?
L’azienda per cui lavoro guadagnerà soldi anche con questo. Mentre io, alle lamentele sul fatto che certe cose devo farle a casa nel tempo libero, o presunto tale, mi devo sentir rispondere: "quello che fai oltre l’orario di lavoro non è competenza nostra, e comunque, fuori o dentro l’orario di lavoro quello che deve essere fatto va fatto".
Tradotto vuol dire "devi lavorare a casa se non ce la fai in ufficio, e non rompere le palle!".
Ma lasciamo perdere lo sfogo e andiamo al dunque. Di seguito una facile funzione per l’upload dei file via form http.
Prerequisiti:
Prima di usare la funzione dovete controllare che nel PHP installato sul vostro server sia abilitata la funzione di upload dei file: nel php.ini il parametro file_uploads deve essere impostato ad 1.
Tenete d’occhio anche il parametro upload_max_filesize che in default è impostato a 2M.
Le opzioni abilitate.
La funzione codificata permette di settare determinati parametri che la rendono quanto più funzionale possibile. I parametri a scelta dell’utente sono:
- $dir = scelta della directory di destinazione.
- $tipo = selta del tipo o dei tipi di file da poter inviare al server.
- $dim = dimensione massima del file da inviare al server. Sempre nei limiti delle impostazioni server.
- $debug = opzioni di debug.
La funzione controlla anche che non esista già un altro file con lo stesso nome nella directory di destinazione, ed avvisa l’utente se la directory impostata per ricevere i file non ha i corretti permessi di scrittura.
Il Codice.
Di seguito il codice della funzione.
//Impostare la path assoluta del proprio sito
$source_dir = "/var/www/test/";
if(!is_uploaded_file($_FILES[‘file’][‘tmp_name’])){
echo "Nessun file selezionato da inviare al server";
exit();
}
if(is_uploaded_file($_FILES[‘file’][‘tmp_name’])){
//Funzione di debug
if($debug != FALSE){
print_r($_FILES);
}
//Controllo che il file non esista
if (is_file($source_dir.$dir.$_FILES[‘file’][‘name’])){
echo "Esiste già un file con lo stesso nome!<br />
Rinominarlo e tentare nuovamente!";
exit();
}
//Controllo il tipo di file se ne ho definito uno o più obbligatori
if($tipo != FALSE){
if(is_array($tipo)){
if(!in_array($_FILES[‘file’][‘type’],$tipo)){
echo "Tipo file non consentito";
exit();
}
}else{
if($_FILES[‘file’][‘type’] != $tipo){
echo "Tipo file non consentito";
exit();
}
}
}
//Controllo che le dimensioni non eccedino il massimo consentito
if($dim != FALSE){
$dimz = $dim * 1024000;
if($_FILES[‘file’][‘size’] > $dimz){
echo "Il file che si sta cercando di inviare è troppo grande!<br />
la dimensione massime consentita è di " . $dim . " megabyte";
exit();
}
}
//Controllo che la directory di destinazione sia server writable
if(!is_writable($source_dir.$dir)){
echo "Non si dispone dei permessi necessari!<br />
Contattare l’amministratore del sistema e far settare i permessi della directory "<i>" . $dir . "</i>" a 0777";
exit();
}
//Passati tutti i controlli posso inviare il file al server!
if(move_uploaded_file($_FILES[‘file’][‘tmp_name’], $source_dir.$dir.$_FILES[‘file’][‘name’])){
echo "Il file è stato inviato correttamente al server!";
}
}
}
In $source_dir immetto la path assoluta di upload. E’ verosimilmente il percorso assoluto in cui risiedono tutti i file del sito.
Se non setto l’opzione $dir, lo script tenterà di uploadare i file nella $source_dir.
Per la gestione dei tipi di file, si noti che la funzione usa l’elemento type dell’array globase $_FILES per capire che tipo di file si sta inviando. E’ possibile settare un solo tipo consentito, ed in questo caso si userà una forma del tipo:
upload(”,’image/jpeg’);
Oppure più tipi di file. In questo modo magari possiamo abilitare l’invio di più formati immagine. Volendo abilitare l’invio dei file png, jpg e gif, useremo l’opzione type come un array che racchiude gli elementi abilitati.
upload(”, array( ‘image/jpeg’,’image/gif’,’image/png’));
Le dimensioni massime vanno indicate in megabyte. E’ del tutto inutile settare una dimensione massima di 5MB se il parametro upload_max_filesize del php.ini sta in default a 2MB. Per cui regolatevi di conseguenza.
Le opzioni di debug, se abilitare, stampano a video un semplice print_r dell’array $_FILES.
Volete testare il tutto?
Create un file di testo. Rinominatelo in upload.php, o altro nome, basta che il file abbia estenzione *.php. Copiate tutto il codice relativo alla funzione, ed aggiungete quanto segue immediatamente dopo.
if(isset($_POST[‘go’])){
upload(‘upload/’,array(‘image/jpeg’,’image/gif’,’image/png’),1, $debug = TRUE);
}else{
?>
<form name="upload" method="post" action="<?=$_SERVER[‘PHP_SELF’]?>" enctype="multipart/form-data" >
<input type="file" name="file" />
<input type="submit" name="go" value="Invia al Server" />
</form>
<?php
}
?>
Ricordatevi di modificare il parametro $soruce_dir.
La funzione, per come evocata nell’esempio, invierà i file nella sottodirectory upload/ del vostro dominio (lo slash finale è molto importante). Abiliterete l’invio dei formati immagine png, jpg e gif, non permetterete l’invio di file superiori ad un megabyte e visualizzerete le informazioni di debug.
Se volete, c’è anche la funzione con relativo esempio in formato testo.
Buona serata
.
. Metteteci pure che sono in lotta con l’azienda per ottenere un contratto degno di questo nome e capirete che non è che si viva tranquillissimi in questo periodo.
) oggi vorrei scrivere qualcosina di interessante (quantomeno per me) sul PHP e l’utilizzo delle espressioni regolari.
. Voglio un po’ dissertare sul loro utilizzo pratico. Perchè e in che contesti possono essere utilizzate.
.