Realizzare una galleria di immagini in PHP (Parte II)


Nella prima parte del mio articolo sono partito con la spiegazione relativa alla realizzazione di una gallery di immagini abbastanza efficace usando il linguaggio PHP e archiviando le informazioni relative alle immagini in una tabella di un database MYSQL.

Avevo preannunciato la descrizione del file uploader.php e gallery.php e passo, ora, a mostrare il listato del primo aggiungendo qualche commento, Il listato di questo file uploader.php può essere il seguente:

<form method="post" action="<?php echo $_SERVER['../../PHP_SELF']; ?>" enctype="multipart/form-data">
<div id="selectalbum" style="border:2px">
            <select name="nome_album" onChange="javascript:location='uploader.php?nome_album='+this.value">
                                   <option value="" <? if ($_REQUEST[nome_album]=="") echo "selected='selected' "?> > </option>                   
                                   < ? // Faccio la query per recuperare l'album
                                   $query_nome_album="SELECT DISTINCT(Album) FROM images WHERE id_utente='$_SESSION[user_id]'";
                                   $result_nome_album=mysql_query($query_nome_album) or die ("impossibile eseguire: $query_nome_album");
                                   while ($row_nome_album=mysql_fetch_array($result_nome_album)) {
                                               $nome_album=$row_nome_album[Album];
                                               ?>
                                   <option value="<?php echo $nome_album ?>" < ? if ($_REQUEST['nome_album']==$nome_album) echo "selected"?>>< ? echo $nome_album ?></option>           
                                   < ? } ?>
            </select>
</div>
            < ?
            if($_REQUEST['nome_album']<>"") {
            ?>
<br />
 
            <input type="file" name="file[]"/><br />
            <input type="file" name="file[]"/><br />
            <input type="file" name="file[]"/><br />
            <input type="file" name="file[]"/><br />
            <input type="file" name="file[]"/><br />
            <input type="submit" name="Submit" value="Submit"/>
 
            <br /><br />
 
< ?php
            if(isset($_POST['Submit'])) {
//              faccio un po' di inclusioni...
                        @include 'config_ph.php';
                        @require 'function.php';
 
//              Creo un array con i formati accettati
                        $tipi_consentiti = array("image/gif","image/jpeg","image/jpg","image/pjpeg","image/png");
 
//              Devo ciclare sui vari file e fargli fare il processo
                        for($i=0;$i<count ($_FILES['file']['name']);$i++) {
 
                                   if(@$_FILES['file']['name'][$i] != "") {
//                                             echo "tipo file i: $_FILES['file'][type][$i] <br>";
//                                             echo "tipo file i: ". $_FILES['file']['type'][$i] ." * $i <br />";
//                                     verifico che il formato del file sia tra quelli accettati
                                               if (in_array($_FILES['file']['type'][$i], $tipi_consentiti)){
                                                           $path_tmp="/tmp";
 
//                                                        copio il file in una cartella temporanea
                                                           @copy ($_FILES['file']['tmp_name'][$i], $path_tmp . $_FILES['file']['name'][$i]);
                                                           $nome = @addslashes($_FILES['file']['name'][$i]);
                                                           $path = $path_img . stripslashes($nome);
                                                           $tipo = @addslashes($_FILES['file']['type'][$i]);
 
// *************************************************
// Sto usando il ridimensionatore smart class per ridimensionare l'immagine originale
// dopo salvo in via definitiva l'immagine ridimensionata e cancello quella temporanea
// *************************************************
 
//                                                         $immagine_da_mostrare=$_FILES['imagefile']['name'];
                                                           $directori="/tmp";
                                                           $nomedelfile=$_FILES['file']['name'][$i];
                                                           $immagine_da_mostrare=$directori.'/'.$nomedelfile;
//                                                         echo "nome img da mostrare: $immagine_da_mostrare <br />";
//                                                                                                                               
                                                           include "../include/SmartImage.class.php";
 
//                                                         Settings
                                                           $src = $immagine_da_mostrare;
                                                           $destination = "$Root/reserved/foto/";
 
//                                                         Start!
                                                           $img = new SmartImage($src);
                                                           $img->resize(600, 400);
                                                           // Resize and save to file
 
                                                           $destinazione=$destination.$nomedelfile;
 
                                                           $img->saveImage($destinazione, 60);
                                                           $img->close();
 
// **************************** FINE smartclass ***************************                      
                                                           @makeThumb($path_img, $immagine_da_mostrare, $nome, $tipo);
 
//                                         aggiorno il database
                                                           $query = "INSERT INTO images (Titolo, Album, Nome, Tipo, id_utente, Datatempo_upload, visibile) VALUES ('$nome', '$_REQUEST[nome_album]', '$nome', '$tipo', '$_SESSION[user_id]', NOW(), 'si')";
                                                           $res = @mysql_query($query) or die (mysql_error());
//                                                         @mysql_close($cn);
 
//                                                         Stampo a video un po' di informazioni
                                                           echo "Nome: ".$_FILES['file']['name'][$i]."<br />";
                                                           echo "Dimensione: ".$_FILES['file']['size'][$i]."<br />";
                                                           echo "Tipo: ".$_FILES['file']['type'][$i]."<br />";
                                                           echo "Copia eseguita con successo.<br /><br />";
//                                                         Cancello il file dalla cartella temporanea
                                                           unlink("$directori/".$_FILES['file']['name'][$i]);
                                               }else{
//                                         stampo un messaggio di errore nel caso in cui il file sia di un formato non consentito
                                                           echo "Impossibile eseguire l'upload. Tipo di file non consentito! <br />";
                                                           echo "nome file: ". $_FILES['file']['name'][$i] ." <br />";
                                               } // Chiudo l'if di in array
                                   } // Chiudo l'if per verificare di prendere solo i nomi dei file pieni
                        } // Chiudo il cliclo for
            } // Chiudo l'if se il campo dell'album è selezionato
            } // Chiudo l'if se ho fatto submit
?>
</form>

Si tratta del file cardine di tutta la gallery e, come si può vedere, è il più corposo.

Esso assolve a diverse funzioni che spiegherò volta per volta.

Questa pagina si compone di un form che come action prevede il reload della pagina stessa, ho aggiunto delle righe relative alla scelta di un album tramite una select dinamica prelevando i nomi degli album dal database ove, preventivamente, ho archiviato i nomi.

A tal proposito si dovrà integrare nel sito una sezione che si occupi della creazione e gestione degli album ma che qui non tratterò.

Qualora sia stato selezionato un album è possibile effettuare l’upload delle 5 foto mediante le 5 caselle di input file. Selezionati i 5 file si invia il form. Se il controllo if(isset($_POST['Submit'])) dà esito positivo viene eseguita la parte di elaborazione dei file.

Si includono, innanzitutto, i file di configurazione e la function vista nella prima parte.

Creo un array con i tipi di file consentiti che, ovviamente, sono i più comuni tipi di file di immagine, questo array servirà per verificare se il tipo di immagine caricata è un tipo di file consentito e che, quindi, si tratta effettivamente di una immagine.

Il sistema di upload, prevedendo il caricamento di 5 file contemporaneamente, richiede un ciclo, realizzato con la variabile $i, per elaborare un file alla volta. In PHP quando, tramite un form, viene caricato un file, il motore PHP gli assegna un nome temporaneo e alcuni parametri vengono salvati in un array di sistema denominato $_FILES.

Con il controllo if(@$_FILES['file']['name'][$i] != “”) { verifico che siano elaborati solo i file che sono stati selezionati nelle caselle di input evitando, così, di elaborare le caselle vuote: può verificarsi la possibilità che vengano caricati 2 o 3 file e non tutti e 5, in questo modo escludo le caselle vuote.

Dall’array $_FILES prelevo l’informazione del tipo del i-esimo file, in_array($_FILES['file']['type'][$i], e verifico che l’estensione prelevata dal file sia presente tra quelle consentite e che sia prevista nell’array $tipi_consentiti.

Copio le immagini tramite il comando copy (anche qui omettendo eventuali messaggi di errore) in una dir temporanea che ho chiamato tmp e posta allo stesso livello in cui si trovano i file PHP.

Successivamente, salvo, in tre variabili il nome, il tipo di immagine e il percorso completo in cui si trova l’immagine. Nelle righe successive ho aggiunto un qualcosa per personalizzare la gallery: se non usassi il ridimensionatore smatclass (che descriverò più avanti) visualizzerei le immagini con le dimensioni originali e questo, in alcuni casi, può risultare scomodo perché se si usa un particolare CSS e l’immagine è troppo grande, questa può finire in una zona in cui vi è un elemento grafico che, in questo modo, viene coperto; con questo semplice script PHP, invece, posso ridimensionare le immagini originali con le dimensioni stabilite a monte del processo.

Questa classe PHP può essere facilmente reperita in rete con le informazioni necessarie per poter modificare e adattare il codice alle proprie esigenze. Una risorsa a questa classe la si può trovare all’indirizzo: http://www.codicefacile.it/smartimage/

Inizio con il riversare alcune informazioni all’interno di variabili che mi saranno utili nell’uso della classe smartimage.

Prima di iniziare a usare il ridimensionatore devo includere il relativo file; in questo caso ho archiviato lo script dello smartimage in una directory denominata include.

In precedenza ho caricato, in una variabile, la directory in cui si trova l’immagine; fornisco, ora, anche il percorso dove l’immagine verrà salvata in via definitiva. Le righe che servono per usare lo smartclass sono davvero semplici e sono le seguenti:

// Start!
$img = new SmartImage($src);
$img->resize(600, 400);
// Resize and save to file
 
$destinazione=$destination.$nomedelfile;
 
$img->saveImage($destinazione, 60);
$img->close();

in cui creo una nuova immagine tramite l’immagine di partenza, la ridimensiono con il comando resize, salvo l’immagine ridimensionata nella posizione che ho deciso in precedenza.

Terminata l’operazione di ridimensionamento della foto passo a creare la miniatura richiamando la function php makeThumb e che ho già descritto.

In ultimo inserisco nel database le informazioni che mi servono quali: il nome dell’immagine, l’album in cui è inserita la foto, la data e l’ora dell’upload etc.; posso, cioè, includere tutte le informazioni che più mi interessano predisponendo, in maniera opportuna, la tabella del database in cui devo archiviare le informazioni di interesse.
Nell’ultima parte faccio visualizzare delle informazioni relative ad ogni foto quali il nome, la dimensione etc in aggiunta a un messaggio che mi informi se la copia della foto è stata effettuata con successo o meno.

Ora che la foto è stata salvata sia nelle dimensioni da me decise sia come miniatura, l’immagine salvata nella dir tmp non mi serve e procedo con il cancellarla tramite il comando PHP unlink fornendo il percorso della dir in cui si trova il file da cancellare e cioè la dir /tmp e il nome del file da eliminare.

Prevedo, anche, la stampa a video di un messaggio di errore nel caso di errore dovuto al tentativo di effettuare l’upload di un file con formato non consentito.

Riassunto

Se nella prima parte di questa serie di articoli dedicati alla realizzazione di una galleria di immagini in PHP abbiamo visto come realizzare i file config.php e function.php in questo secondo appuntamento invece abbiamo visto come realizzare i file upload.php, nella prossima ed ultima parte vedremo come realizzare invece i file gallery.php e visual.php.

Info sull' autore:
Laureato in matematica con la passione per internet. Ho fatto una esperienza abbastanza interessante in questo ruolo con un assegno di ricerca. Ho avuto modo di approfondire e utilizzare al meglio le potenzialità del linguaggio PHP e dei database MYSQL mirati alla gestione e pubblicazioni di dati ambientali.
Leggi gli altri articoli di

9 Risposte per Realizzare una galleria di immagini in PHP (Parte II)

  1. michele 25 maggio 2011 at 19:04 | Permalink | Reply

    Ma la terza ed ultima parte quando la publicate?

    • Francesco 25 maggio 2011 at 19:17 | Permalink | Reply

      Ciao Michele, Martedì prossimo, abbiamo dovuto spezzare i tutorial per questioni di lunghezza, ancora un pò di pazienza!

      • michele 26 maggio 2011 at 01:45 | Permalink | Reply

        Ok! grazie, allora a martedi… cmq seguendo il tutorial manca il file DB per la realizzazione, allegherete uno ZIP per racchiudere il vostro tutorial?

        A presto!

  2. PeppePegasus 26 maggio 2011 at 09:48 | Permalink | Reply

    Ciao,

    per ora non è previsto un file zip in cui racchiudere il tutorial.
    Quanto alla parte del database nella prima parte c’è una piccola parte dedicata alla descrizone della tabella da usare.

  3. Francesco 26 maggio 2011 at 18:05 | Permalink | Reply

    ma i dati che richiamano il nome_album bisogna creare una tabella Album… mi servirebbe una delucidazione?

  4. francesco 26 maggio 2011 at 22:09 | Permalink | Reply

    Avrei un problema a capire come funziona il select per richiamare il nome dell’album, mi spiego bene… dovrei creare una tabella Album ed al suo interno dovrei inserire il campo “nome_album” e images “user_id” o viceversa creare il tutto nella tabella “images”.
    Datemi una mano a creare il DB? GRAZIE

  5. PeppePegasus 27 maggio 2011 at 10:26 | Permalink | Reply

    ciao,

    io ho immaginato di usare una sola tabella per le immagini e per gli album, secondo me sarebbe superfluo avere una tabella solo per gli album ma ciò non esclude di memorizzare gli album in una tabella separata dalle foto. sono scelte che uno può fare.
    ciao.

  6. Daniele 5 giugno 2011 at 19:19 | Permalink | Reply

    Avete fatto un ottimo lavoro, ma purtroppo non mi funziona. La mia prima perplessità è relativa all’uso di $_SESSION[user_id], il quale nel file uploader.php, richiede questo stringa che non capisco dove si trovi, infatti, mi appare nel suddetto file una select vuota, e di conseguenza non mi appaiono i 5 input file per caricare le foto…..sapete darmi qualche indicazione,? grazie

  7. PeppePegasus 6 giugno 2011 at 11:47 | Permalink | Reply

    ciao,

    il problema che tu rilevi è relativo alla parte di creazione e gestione degli album..questa cosa è spiegata in breve nell’articolo e anche in qualche mia risposta a un commento.
    Una possibile soluzione è che immetti nel database e nella tabella dove archivierai i dati delle foto inserisci un album. Una volta che avrai un album nella tabella il resto funzionerà.
    se hai problemi posta i tuoi commenti e cercherò di aiutarti.
    ciao.

Lascia un commento

Trackbacks