Come gestire i file: l’upload
Eccoci arrivati all’ultima parte della nostra guida. Abbiamo parlato fin ora della classe YCFile e del download, di come rinominare, controllare, trovare e leggere file.
Ma manca ancora l’upload. Ne parleremo oggi e ti mostrerò come utilizzare la classe upload di Colin Verot per caricare e modificare praticamente ogni tipo di file!
Struttura della guida
Come gestire i file: le basi (parte 1)
Questo primo articolo è incentrato sulla creazione di una classe per gestire i file. Ti mostro come effettuare controlli di sicurezza preliminari e alcuni metodi per ottenere informazioni basilari.
Come gestire i file: le basi (parte 2)
Ecco come cercare, leggere ed eliminare i file, effettuando controlli a monte ed eliminando ogni futuro e possibile problema.
Come gestire i file: il download
Vediamo come effettuare il download dei file in sicurezza per te e per i tuoi utenti.
Come gestire i file: l’upload
Ed infine ecco come effettuare l’upload dei file sul server, con l’ausilio della classe class.upload.
Classe upload
La classe upload è una classe estremamente potente (e gratuita per uso personale) per l’upload di qualunque tipo di file e per la manipolazione delle immagini.
In questo articolo ti mostrerò solamente come caricare un file e come manipolare, a livello base, le immagini, ma se vuoi approfondire l’argomento, c’è un’enorme documentazione a riguardo.
Come caricare un file
L’upload di un file, come già detto, è veramente semplice e molto veloce.
Ometterò la parte riguardante l’HTML del form per effettuare l’upload e passerò direttamente allo script PHP per poter gestire il file.
Iniziamo subito con l’includere la classe upload e la sua traduzione italiana e a controllare l’esistenza del vettore $_FILES.
if(!empty($_FILES['file']['name'])) { require_once('./class.upload/class.upload.php'); require_once('./class.upload/lang/class.upload.it-IT.php'); }
Ora abbiamo a disposizione la nostra classe, quindi creiamo un’istanza e stabiliamo i tipi di file permessi.
if(!empty($_FILES['file']['name'])) { require_once('./class.upload/class.upload.php'); require_once('./class.upload/lang/class.upload.it-IT.php'); $handler = new upload($_FILES['file'], 'it-IT'); $handler->allowed = 'image/*'; }
Con le due righe aggiunte, istanziamo la classe indicandogli quale file gestire e la lingua con la quale deve restituirci gli eventuali errori. Il secondo parametro (quello della lingua) non è obbligatorio, come valore di default ci sarà la lingua inglese.
Con la seconda riga specifichiamo che tipi di file sono permessi per l’upload. Ci sono due modi per farlo:
- se dobbiamo permettere l’upload solo ad un tipo di file, possiamo assegnare alla proprietà allowed una stringa;
- nel caso invece volessimo permettere l’upload di più tipi di file, dovremo assegnare come valore un array. Ecco un esempio:
//In questo modo permettiamo l’upload solo ai file di tipo PNG $handler->allowed = 'image/png'; //In questo modo invece, permettiamo l’upload a tutti i tipi di file immagine e video $handler->allowed = array('image/*', 'video/*');
Per il nostro esempio abbiamo scelto di far caricare all’utente soltanto immagini. Nel caso non doveste impostare la proprietà allowed, di default saranno permessi molti tipi di file (quasi tutti i tipi praticamente, tranne quelli potenzialmente dannosi come gli eseguibili o gli script web).
Volendo, possiamo impostare anche la proprietà forbidden allo stesso modo, indicando i file che non possono essere caricati.
A questo punto il nostro file dovrebbe già essere stato caricato sul server. Controlliamo che lo sia effettivamente e poi potremo passare alla sua manipolazione:
if(!empty($_FILES['file']['name'])) { require_once('./class.upload/class.upload.php'); require_once('./class.upload/lang/class.upload.it-IT.php'); $handler = new upload($_FILES['file'], 'it-IT'); $handler->allowed = 'image/*'; if($handler->uploaded) { //manipoliamo il file } else { echo $handler->error; } }
Modificare un file immagine
Ora che siamo sicuri che il file sia stato caricato correttamente, possiamo andare avanti e modificare la nostra immagine.
Iniziamo con l’impostare le variabili di base che ci serviranno per le modifiche:
/* … */ //Rinominiamo il file $handler->file_new_name_body = time(); //Abilitiamo il ridimensionamento dell'immagine $handler->image_resize = true; //Impostiamo la larghezza dell'immagine a 150px $handler->image_x = 150; //Non impostiamo un valore fisso all'altezza, ma lasciamo che la classe calcoli automaticamente il suo valore, //mantenendo il rapporto larghezza/altezza $handler->image_ratio_y = true; /* … */
Analizzando il codice qui sopra, possiamo capire che bisogna settare la proprietà file_new_name_body se si vuole rinominare il file. Il suo valore sostituirà il nome del file attuale.
Nel caso invece volessimo aggiugere una stringa al nome attuale del file possiamo farlo valorizzando le proprietà file_name_body_pre (per aggiungere la stringa all’inizio del nome attuale) e file_name_body_add (per aggiungere la stringa alla fine del nome attuale).
Con la riga successiva, diciamo alla classe che vogliamo ridimensionare l’immagine e successivamente fissiamo la larghezza che dovrà avere (150px nel nostro caso) mentre lasciamo che la classe calcoli automaticamente l’altezza in rapporto alla larghezza da noi impostata. Volendo possiamo fare la stessa cosa con la larghezza impostando la proprietà image_ratio_x a true, oppure settarle entrambe a dimensioni fisse.
Salvataggio dell’immagine modificata
Ora siamo pronti a modificare l’immagine e salvarla in modo definitivo sul server.
Il procedimento è semplicissimo, basta aggiungere solo una riga di codice.
$handler->Process('./images/');
Con il metodo Process() diciamo alla classe di effettuare tutte le modifiche precedentemente impostate, e di salvare l’immagine risultante nella directory indicata come parametro.
Ma noi vogliamo essere più precisi, così aggiungiamo un controllo per essere sicuri che tutto sia andato a buon fine.
$handler->Process('./images/'); if($handler->processed) { $handler->Clean(); exit( 'Success.' ); } else { echo $handler->error; }
Ecco fatto, il nostro file è stato modificato e salvato correttamente.
Il metodo Clean() elimina i file dalla cartella temporanea. Non è obbligatorio utilizzarlo, ma io consiglio di farlo.
Se invece vogliamo stampare il file direttamente a video senza salvarlo, possiamo utilizzare sempre il metodo Process() in questo modo:
//Stampiamo il risultato del metodo, senza passargli nessun argomento. echo $handler->Process()
Ecco tutto il codice necessario per effettuare l’upload e il ridimensionamento di un’immagine:
if(!empty($_FILES['file']['name'])) { include_once('./classupload/class.upload.php'); include_once('./classupload/lang/class.upload.it_IT.php'); $handler = new upload($_FILES['file'], 'it-IT'); $handler->allowed = 'image/*'; if($handler->uploaded) { //Rinominiamo il file $handler->file_new_name_body = time(); //Abilitiamo il ridimensionamento dell'immagine $handler->image_resize = true; $handler->image_x = 150; //Impostiamo la larghezza dell'immagine a 150px //Non impostiamo un valore fisso all'altezza, ma lasciamo che la classe calcoli automaticamente il suo valore, //mantenendo il rapporto larghezza/altezza $handler->image_ratio_y = true; $handler->Process('./images/'); if($handler->processed) { $handler->Clean(); exit( 'Success.' ); } else { echo $handler->error; } } else { echo $handler->error; } }
Conclusioni
Ti consiglio di leggere tutta la documentazione anche se è un pò lunga, solo così potrai accorgerti delle vere potenzialità di questa classe. Noi ne abbiamo analizzata solo una piccolissima parte, ma con essa si può anche stravolgere un’immagine rendendola completamente diversa da quella originale.
Siamo arrivati alla fine di questa guida. Cosa ne pensi, ti è stata utile? Ti ha aiutato a capire come comportarsi con i file o hai un metodo migliore?
Download
14 commenti
Trackback e pingback
[...] gestire i file: l’upload (Your Inspiration [...]
[...] Come gestire i file: l’upload Ed infine ecco come effettuare l’upload dei file sul server, con l’ausilio della classe…
[...] Come gestire i file: l’upload Ed infine ecco come effettuare l’upload dei file sul server, con l’ausilio della classe…