Caricamento di immagini sul server con PHP e MySQL - Upload

Introduzione

L'obiettivo di questo tutorial è descrivere come effettuare il caricamento delle foto sul server in modo da poter essere visualizzate in un album fotografico. L'immagine, con una breve descrizione, verrà inserita nel database attraverso una schermata di input tipo la seguente:

Descrizione
Foto

Attraverso il bottone sfoglia, sarà quindi possibile scegliere la foto sul computer locale da inserire sul server WEB.

Preparazione del modulo (form)

Nel creare il modulo il campo di testo che contiene la descrizione si chiamerà descrizione mentre il campo file per il caricamento della foto si chiama userfile

<form action="" method="post" enctype="multipart/form-data" name="form1">
<table align="center">

<tr valign="baseline">
<td nowrap align="right">Descrizione:</td>
<td><input type="text" name="descrizione" value="" size="32"></td>
</tr>
<tr valign="baseline">
<td nowrap align="right">Foto</td>
<td> <input name="userfile" type="file" id="foto"></td>
</tr>
<tr valign="baseline">
<td nowrap align="right">&nbsp;</td>
<td><input type="submit" value="Inserisci Foto"></td>
</tr>

</table>

<input type="hidden" name="MAX_FILE_SIZE" value="30000">
</form>

Il campo nascosto MAX_FILE_SIZE impostato a 30000 Bytes serve a impedire che vengano caricate immagini con dimensioni eccessive.

Come avviene il caricamento della foto (upload)

Quando viene fatto click su Inserisci Foto il file contenente l'immagine viene inviato al server che lo memorizza in un'area temporanea. Attraverso la variabile

$_FILES['userfile']['tmp_name']

è possibile accedere all'immagine. Faremo riferimento a tale file utilizzando il seguente assegnamento:

$file_temp=($_FILES['userfile']['tmp_name']);

L'immagine quindi dovrà essere spostata in una cartella sul server in modo da poterla utilizzare.

Un accorgimento importante è il nome da dare all'immagine. Una buona soluzione è quella di utilizzare il numero del campo indice ottenuto con l'inserimento del record.
Ipotizziamo che la tabella delle foto abbia la seguente struttura:

CREATE TABLE `foto` (
`id_foto` int(10) unsigned NOT NULL auto_increment,
`descrizione` varchar(20) NOT NULL default '',
PRIMARY KEY (`id_foto`)
);

è possibile sapere il valore di id_foto dopo l'inserimento di un record con l'istruzione

$ultimo_id = mysql_insert_id();

Il nome del file della foto sarà quindi dato da

  • Cartella che contiene le foto ES: “foto/”. Si può utilizzare una variabile per memorizzare questo percorso: $percorso="foto/";
  • Valore di id_foto contenuto in $ultimo_id
    Tipo di file: normalmente “.jpg”

Si otterrà quindi un note tipo “foto/15.jpg”. L'istruzione che crea il nuovo nome è: $nuovo_nome=$percorso.$ultimo_id.".jpg";

Prima di inserire la foto è possibile verificare se il file è stato inviato. Utilizzando la funzione file_exists() è possibile sapere se l'immagine è stata caricata sul server.

$inviato=file_exists($file_temp);

La variabile $inviato conterrà “true” se il file è stato caricato.

Lo spostamento della foto nella cartella avviene con la funzione

move_uploaded_file(<file temporaneo>,<nuovo file>);

Dopo l'inserimento è possibile passare ad un'altra pagina attraverso l'istruzione header().

Il codice

$insertSQL = "INSERT INTO foto (descrizione) VALUES ('".$_POST['descrizione']."')";
//preparo la stringa per l'inserimento

mysql_select_db($database_eventi, $eventi);
//effettuo l'inserimento sul database

$Result1 = mysql_query($insertSQL, $eventi) or die(mysql_error());
//effettuo l'inserimento sul database

$ultimo_id=mysql_insert_id();
//valore di foto_id dopo l'inserimento

$file_temp=($_FILES['userfile']['tmp_name']);
//file temporaneo che contiene l'immagine caricata

$percorso="foto/";
//cartella sul server dove verrà spostata la foto

$nuovo_nome=$percorso.$ultimo_id.".jpg";
//nuovo nome dell'immagine

$inviato=file_exists($file_temp);
//verifica se il file è stato caricato sul server

if ($inviato) {

move_uploaded_file($file_temp,$nuovo_nome);
header("Location:VisualizzaFoto.php");
// sposto l'immagine nella cartella e vado
// alla pagina di visualizzazione
} else {
header("Location:Errore.php");
// vado alla pagina di errore

}

 

Abilitare i permessi

Per fare in modo che le foto vengano caricate sul server occorre che la cartella foto abbia i permessi abilitati di scrittura e di esecuzione. Se i permessi non sono corretti si avrà tipicamente una segnalazione di errore del tipo

Warning: move_uploaded_file(1.JPG):
failed to open stream:
Permission denied in /users/sito/adim/caricafoto.php on line xx

Per impostare correttamente i permessi a 777 si può usare il comando CHMOD.

Alcuni provider attraverso il Cpanel consentono di impostare facilmente questo valore.