lunedì 15 agosto 2011

PHP: gestire l'upload di immagini

Primo minitutorial sul PHP (che ahimé ultimamente mi trovo a dover utilizzare sempre più spesso xD), vediamo come gestire l'upload di immagini.
Tralasciando la parte dedicata al form per l'upload che non ci interessa per lo scopo di questo tutorial, passiamo subito al codice.
Direi di cominciare subito con un bel controllo sulla validità della richiesta:
if (is_uploaded_file($_FILES['image']['tmp_name']))
{
...
}
Ovviamente al posto di 'image' ci và il valore del campo "name" che avete usato nel form di upload ;)
Ma a cosa serve questo controllo? Beh, presto detto: la funzione is_uploaded_file ritorna come valore TRUE se la richiesta di upload è stata effettuata via HTTP POST. Che significa questo in parole povere? Che in questo modo vi assicurate che un utente malintenzionato non stia cercando, invece di uppare una innocua immagine, di inserire del codice maligno sul vostro server.
È un semplice controllo di "sicurezza" quindi, ma vi consiglio SEMPRE di usarlo. Il web è pieno di gente con cattive intenzioni :P

Dopo questo controllino di sicurezza direi che possiamo andare a prendere i primi dettagli sulla immagine che si vuole uppare. Perché fare questo? Beh, ad esempio possiamo voler limitare l'upload solo a un particolare tipo di immagini escludendo certi altri (GIF, PNG, BMP, JPEG, ecc...), oppure potremmo voler limitare l'upload a immagini di dimensioni minori di un certo TOT di byte, oppure ancora limitare l'upload a immagini non più larghe di un TOT di pixel, e via dicendo.
Vediamo il primo controllo:
if (($_FILES['image']['size'] < (5*1024*1024)) { ... }

Tramite questo semplice controllo possiamo gestire il "peso massimo" che deve avere il file. Nell'esempio sopra il massimo è 5MB ma naturalmente potete impostarlo come e quanto vi pare.
Come potete notare rispetto a prima è cambiato il secondo termine dell'array $_FILES: infatti è grazie al campo 'size' che possiamo ottenere la dimensione in byte del file che stiamo cercando di uppare.

Adesso vediamo un nuovo controllo:
list($width, $height, $type, $attr) = getimagesize($_FILES['image']['tmp_name']);
if (($width > 640) || ($height > 480)) {
...
}
In questo esempio abbiamo preso le informazioni sull'immagine con la prima riga e subito dopo abbiamo controllato che l'immagine sia minore di 640x480px.
All'interno dell'IF sopra va inserito il codice che si vuole usare nel caso in cui l'immagine SUPERI le dimensioni consentite (nell'esempio appunto 640x480).

Ora controlliamo il tipo d'immagine:
list($width, $height, $type, $attr) = getimagesize($_FILES['image']['tmp_name']);
if (($type!=1) && ($type!=2) && ($type!=3)) {
...
}
In questo esempio controlliamo che l'immagine appartenga ai primi tre tipi di immagini supportati dal PHP. Anche qui all'interno dell'IF va inserito il codice da eseguire nel caso l'immagine che si sta tentando di uppare NON sia in uno dei suddetti 3 formati.
I formati consentiti dal PHP per le immagini sono:
[IMAGETYPE_GIF] => 1
[IMAGETYPE_JPEG] => 2
[IMAGETYPE_PNG] => 3
[IMAGETYPE_SWF] => 4
[IMAGETYPE_PSD] => 5
[IMAGETYPE_BMP] => 6
[IMAGETYPE_TIFF_II] => 7
[IMAGETYPE_TIFF_MM] => 8
[IMAGETYPE_JPC] => 9
[IMAGETYPE_JP2] => 10
[IMAGETYPE_JPX] => 11
[IMAGETYPE_JB2] => 12
[IMAGETYPE_SWC] => 13
[IMAGETYPE_IFF] => 14
[IMAGETYPE_WBMP] => 15
[IMAGETYPE_JPEG2000] => 9
[IMAGETYPE_XBM] => 16
[IMAGETYPE_ICO] => 17
[IMAGETYPE_UNKNOWN] => 0
[IMAGETYPE_COUNT] => 18


E adesso direi che con i controlli possiamo finirla qui, dovremmo aver soddisfatto un po' tutte le eventuali limitazioni che un normale servizio di hosting possa imporre.
Uppiamo quindi la nostra immagine!
if (!move_uploaded_file($_FILES['image']['tmp_name'], $_FILES['image']['name'])) {
...
}
Nel codice sopra andiamo ad uppare l'immagine salvandola sul server con il nome (compreso di estensione!) che ha il file della vostra immagine sul vostro PC.
All'interno dell'IF va inserito il codice da eseguire nel caso l'upload NON vada a buon fine.

Finito, come avete potuto leggere non è così complesso come sembra ;)

Nessun commento:

Posta un commento