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
Tag: , ,

L'autore

Sviluppo per il web da alcuni anni. Ultimamente mi sono specializzato in WordPress tramite Your Inspiration, con il quale attualmente lavoro nell'area di supporto clienti e sviluppo temi e plugin per WP.

Sito web dell'autore | Altri articoli scritti da

Articoli correlati

Potresti essere interessato anche ai seguenti articoli:

  • Come creare le thumbnail con la libreria GD

    Nel precentente tutorial abbiamo visto come implementare la classe upload. In questo articolo vedremo come sviluppare la creazione delle miniature...

  • Come utilizzare la classe Upload

    Nel precedente tutorial abbiamo sviluppato la classe Upload, una classe astratta che per essere utilizzata deve essere estesa. Ricordo che il nostro...

  • Una classe per gestire l’upload

    Nel precedente articolo, abbiamo visto le basi della procedura di upload di un file. Oggi svilupperemo una classe robusta e configurabile in grado di...

14 commenti

Trackback e pingback

  1. Articoli settimana 04/03/2012 | Saverio Gravagnola
    [...] gestire i file: l’upload (Your Inspiration [...]
  2. Come gestire i file: le basi (parte 2) | Your Inspiration Web
    [...] Come gestire i file: l’upload Ed infine ecco come effettuare l’upload dei file sul server, con l’ausilio della classe…
  3. Come gestire i file: il download | Your Inspiration Web
    [...] Come gestire i file: l’upload Ed infine ecco come effettuare l’upload dei file sul server, con l’ausilio della classe…