HTML.it forum : Powered by vBulletin version 2.3.6 HTML.it forum > Lato server > PHP > [PILLOLA] upload+resize+thumbnails
Vai al forum:
Indietro   Ricarica   Avanti

Pagine (19): [ 1   2   3   4   5   >   >> ]  
Autore
Discussione    Invia una risposta
xPilux
Utente di HTML.it



Registrato il: Jul 2004

Provenienza: Bollate

Messaggi: 104


ICQ:

MSN:

Skype:


[PILLOLA] upload+resize+thumbnails
Visto che l'argomento trattato è stato il soggetto di molti degli ultimi post, e dato che è stato chiesto, ho deciso di scrivere questa pillola, sperando di scriverla bene e sperando che possa essere utile e chiara. Il fine di questa pillola è quello di sfruttare le potenzialità di PHP per fare l'upload di un immagine e creare un immagine ridimensionata per esempio a 400 pixel di altezza e allo stesso tempo creare una thumbnail da 75 pixel di altezza della stessa immagine.



Per fare ciò organizziamo il filesystem in questo modo:

codice:

    img_big   //cartella in cui metteremo le immagini

    img_small //cartella in cui metteremo le thumbnail

    include   //cartella in cui metteremo la classi php

       |_image.class.php

       |_upload.class.php

    tmp       //cartella temporanea in cui metteremo i file uploadati

    config.php

    index.php

    upload.php

    view.php





Cosa dobbiamo fare:



[1] Creare un form con 2 campi: uno sarà un campo di tipo file per scegliere l'immagine dal proprio hd e l'altro sarà semplicemente di tipo 'text',per scegliere il nome che l'immagine avrà sul server; se il campo non è compilato il file avrà il nome originale che avevo sul nostro hc.



codice:

<form action="upload.php" method="post" enctype="multipart/form-data">

File:<br/>

<input name="file" type="file"><br/>

Nome:<br/>

<input name="new_name" type="text"><br/>

<br/>

<input name="submit_upload" type="submit" value="Invia">

</form>





Non dimenticate enctype="multipart/form-data" altrimenti non funziona.



[2] Tramite POST manderemo i dati del form alla pagina upload.php: qui richiameremo il file './include/upload.class.php' per fare l'upload dell'immagine, e tramite il file './include/image.class.php'verranno create le immagini e le thumbnails.



Vediamo il codice delle 2 classi e poi commenterò il file upload.php che sfrutta appunto queste 2 classi:



upload.class.php

codice PHP:


<?

class FileUpload{

    var
$up_dir;        //la directory temporanea in cui verrà uploadata l'img

    
var $filename;    //il nome del file

    
var $new_filename;    //il nuovo nome del file se vogliamo rinominarlo



    
function FileUpload($up_dir){

        
$this->up_dir = $up_dir;

    }

      

    function
RenameFile($new_filename){

        
$this->new_filename = $new_filename;

    }



    function
Upload($files){

        if(!
file_exists($this->up_dir))

            die(
'La directory non esiste!');



        
$this->filename = ($this->new_filename) ? $this->new_filename :$files['name'];

        if(
trim($files["name"]) == "")

            die(
"Non hai indicato il file da uploadare!");



        if(
is_uploaded_file($files["tmp_name"])){

            
move_uploaded_file($files["tmp_name"],$this->up_dir."/".$this->filename)

            or die(
"Impossibile spostare il file;controlla l'esistenza o i permessi della directory!");

        }else

            die (
"Problemi nell'upload del file ".$files["name"]);

    }

           

    function
DeleteFile(){

        
unlink($this->up_dir . '/' . $this->filename);

    }

}

?>





Il costruttore della classe riceve solo un parametro: il nome della directory in cui uploadare il file.

Quindi procederemo cosi:



codice PHP:

$up
= new FileUpload('./tmp');




Prima di effettuare l'upload abbiamo la possibilità di rinominare il file con il metodo RenameFile();; Quindi potremo rinominare il file sul server in questo modo:



codice PHP:

$up
->RenameFile($_POST['new_name']);    //che è la variabile che arriva dal nostro form




A questo punto chiamando il metodo Upload, ci sarà l'effettivo upload del file:



codice PHP:

$up
->Upload($_FILES['file']);    //gli mandiamo il file che arriva dal nostro form




Una volta uploadato il file possiamo creare le immagini e le thumbnails sfruttando la classe Image.



image.class.php



codice PHP:


<?PHP

class Image{

    var
$src_filename;

    var
$src_witdh;

    var
$src_height;

    var
$src_type;

    var
$src_attr;

    var
$src_image;  



    function
Image($filename){

        
$this->src_filename = $filename;

        
$this->GetImageInfo();

    }



    function
GetImageInfo(){

        list(
$this->src_width,$this->src_height, $this->src_type, $this->src_attr) = getimagesize($this->src_filename);

    }



    function
CreateSourceImage(){

        switch(
$this->src_type){

            case
1:

                
$this->src_image =imagecreatefromgif($this->src_filename);

                   break;

            case
2:

                
$this->src_image =imagecreatefromjpeg($this->src_filename);

            break;

            case
3:

                
$this->src_image =imagecreatefrompng($this->src_filename);

            break;

            default:    return
false;

        }



        return
true;

    }



    function
SaveProportionateImage($filename, $quality, $height){

        
$dest_height = $height;

        
$ratio = $this->src_height / $dest_height;

        
$dest_image = imagecreatetruecolor( $this->src_width / $ratio,$dest_height);

        
imagecopyresampled($dest_image, $this->src_image, 0, 0, 0, 0,

            
$this->src_width / $ratio,

            
$this->src_height / $ratio,

            
$this->src_width,

            
$this->src_height);

        
imagejpeg($dest_image, $filename.'.jpg', $quality);

        
imagedestroy($dest_image);

    }



    function
Free(){

        
imagedestroy($this->src_image);

    }

}

?>





Il costruttore di questa classe accetta un parametro che è la path dell'immagine che andremo a ridimensionare. Quindi istanzieremo la classe così:



codice PHP:

$img
= new Image('./tmp/' . $up->filename);



//$up->filename è il nome del file uploadato o il 'nuovo_nome' del file

//in caso abbiamo usato il metodo RenameFile della classe FileUpload.




A questo punto, sfruttando la libreria GD di PHP, andremo a lavorare sulle immagini. Come prima cosa dovremo creare l'immagine sorgente leggendo il file dell'immagine uploadata: non sapendo a priori il tipo di immagine, faremo uno switch su type, restituito dalla funzione getimagesize(), che ritorno il tipo di immagine oltre alla sua dimensione.



Per fare ciò useremo il metodo CreateSourceImage() della nostra classe Image.



codice PHP:

$result
= $img->CreateSourceImage();




Questo metodo ritorna un booleano: true se è tutto andato a buon fine, false se il tipo di immagine non è supportato,o se addirittura il file uploadato non è un immagine.



Se il risultato è false, non possiamo andare avanti, al contrario procediamo creando il l'immagine e poi la thumbnail. Semplicemente richiameremo lo stesso metodo due volte,mandando come parametro $height due altezze diverse.

Il metodo in questione è SaveProportionateImage() che accetta 3 parametri:



[*] $filename, che sarà il file in cui verrà salvata l'immagine ridimensionata.

[*] $quality, che sarà un intero compreso tra 0 e 100, che il nostro metodo passerà alla funzione delle GD per creare l'immagine. 0 è la qualità minima, 100 la massima.

[*] $height sarà l'altezza della massima della nostra immagine.



In realtà il metodo può essere implementato facendo in modo che, se l'altezza dell'immagine originale sia inferiore a $height, questa non sia ridimensionata, altrimenti verrebbe ingrandita e quindi perderebbe qualità.

Passeremo solo il parametro $height e non $width, in modo da controllare l'altezza dell'immagine che creeremo, senza però storpiarla o tagliarla;

Ad ogni modo sarebbe facile implementare un secondo metodo che crei l'immagine prendendo altezza e larghezza come parametri.



Quindi faremo:



codice PHP:

$img
->SaveProportionateImage('./img_big' . $up->filename, 100, 400);

$img->SaveProportionateImage('./img_small' . $up->filename, 100, 75);




L'immagine verrà perciò salvata due volte con lo stesso nome ma in cartelle diverse e con dimensione diversa.

A questo punto chiameremo il metodo Free() della classe Image per liberare la memoria



codice PHP:

$img
->Free();




e subito dopo il metodo DeleteFile() della classe FileUpload, per liberare la memoria:

codice PHP:

$up
->DeleteFile();




Ora posto gli altri due file, che in realtà fanno quello che ho appena riassunto: in config.php, definisco semplicemento tutte le costanti che useremo nel nostro script:



config.php



codice PHP:


<?PHP

define
('TMP_DIR', './tmp');

define('IMAGE_DIR', './img_big');

define('THUMB_DIR', './img_small');

define('IMAGE_QUALITY', 80);

define('THUMB_QUALITY', 70);

define('IMAGE_HEIGHT', 400);

define('THUMB_HEIGHT', 75);

?>





upload.php, è il file che riceve i dati dal form,quindi non fa altro che sfruttare le classi e i metodi descritti sopra:



upload.php

codice PHP:


<?PHP

if(!isset($_POST['submit_upload'])){

    
header("Location: index.php");

}else{

    include_once
'config.php';

    
//faccio l'upload dell'img

    
include_once './include/upload.class.php';

    if(!isset(
$_FILES)) $_FILES = $HTTP_POST_FILES;

    if(!isset(
$_SERVER)) $_FILES = $HTTP_POST_VARS;



    
$up = new FileUpload(TMP_DIR);

    
$up->RenameFile($_POST['new_name']);

    
$up->Upload($_FILES['file']);

    
//adesso ridimensiono l'img a 400 x 400

    
include_once './include/image.class.php';

    
$img = new Image(TMP_DIR . '/' . $up->filename);

    
//creo l'immagine sorgente

    
$result = $img->CreateSourceImage();

    
//se il tipo di immagine è supportato

    //salvo 2 file:

    //uno con l'img grande e uno con l'img piccola

    //nelle rispettive directory

    
if($result){

        
//salvo l'immagine con altezza 400 lasciandola proporzionata

        
$img->SaveProportionateImage(IMAGE_DIR . '/' . $up->filename, IMAGE_QUALITY, IMAGE_HEIGHT);

        
//salvo l'immagine con altezza 75 lasciandola proporzionata

        
$img->SaveProportionateImage(THUMB_DIR . '/' . $up->filename, THUMB_QUALITY, THUMB_HEIGHT);

        
//libero la memoria cancellando l'immagine sorgente

        
$img->Free();

    }

    
//se il tipo di img non è supportata

    //o se il file uploadato nn è un immagine

    
else

        echo
'Immagine non valida<br/>';

    
//In ogni caso cancello il file uploadato nella cartella ./tmp

    
$up->DeleteFile();

    echo
'<a href="view.php">Guarde le immagini</a>';

}

?>





Il file view.php, semplicemente visualizza le thumbnails e le linka alle immagini grosse



view.php

codice PHP:


<?PHP

include_once 'config.php';



$dir = dir(THUMB_DIR);

while(
$img = $dir->read()){

    if( (
$img != '.') & ($img != '..') )

        echo
'<a href="'.IMAGE_DIR.'/'.$img.'"><img src="'.THUMB_DIR.'/'.$img.'"></a>';

}

?>





Spero di non aver scritto qualche cavolata...in tal caso ditemelo!

Spero anche che possa servire quello che ho scritto...fatemi sapere



-Pilu-

Segnala ad un moderatore | IP: Collegato | Permalink

xPilux è offline Old Post 01-08-2004 18:49
Clicca qui per vedere il profilo dell'utente xPilux Clicca qui per inviare all'utente xPilux un messaggio privato Visualizza ulteriori messaggi scritti dall'utente xPilux Aggiungi l'utente xPilux alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Dark Bard
Utente di HTML.it



Registrato il: Nov 2001

Provenienza: Caronno Pertusella

Messaggi: 345


ICQ :

MSN :

Skype :


Bella pilu

ci vediamo domani a lavoro!

(-5 gg alle vacanze!! )


__________________
eXtending-Php.net coming soon ...

Segnala ad un moderatore | IP: Collegato | Permalink

Dark Bard è offline Old Post 01-08-2004 22:19
Clicca qui per vedere il profilo dell'utente Dark Bard Clicca qui per inviare all'utente Dark Bard un messaggio privato Visualizza ulteriori messaggi scritti dall'utente Dark Bard Aggiungi l'utente Dark Bard alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
pipu
Utente di HTML.it



Registrato il: Jan 2004

Provenienza: cagliari

Messaggi: 92


ICQ :

MSN :

Skype :


ottimissimo lavoro!
finalmente! ci volevaaaa!
dopo ore di lettura di tread incompleti ho finalmente qualcosa su cui studiare!


__________________
Coder Club..Programmi per sapere chi sei!

Segnala ad un moderatore | IP: Collegato | Permalink

pipu è offline Old Post 01-08-2004 22:27
Clicca qui per vedere il profilo dell'utente pipu Clicca qui per inviare all'utente pipu un messaggio privato Visualizza ulteriori messaggi scritti dall'utente pipu Aggiungi l'utente pipu alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
xPilux
Utente di HTML.it



Registrato il: Jul 2004

Provenienza: Bollate

Messaggi: 104


ICQ :

MSN :

Skype :


OK,poi dimmi se va tutto bene o se mi sono dimenticato di spiegare qualche passo!ciao

Segnala ad un moderatore | IP: Collegato | Permalink

xPilux è offline Old Post 02-08-2004 11:35
Clicca qui per vedere il profilo dell'utente xPilux Clicca qui per inviare all'utente xPilux un messaggio privato Visualizza ulteriori messaggi scritti dall'utente xPilux Aggiungi l'utente xPilux alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
gasmor
Utente di HTML.it



Registrato il: Apr 2004

Provenienza: Teramo

Messaggi: 1649


ICQ :

MSN :

Skype :


ciao, la tua pillola è molto interessante ed utile.
Grazie per aver trattato l'argamento

però ho qualche problema a far funzionare il tutto.

Ho creato nel mio server locale una cartella contenente l'esempio così come lo hai descritto. Però quando inserisco un file mi appare questa scritta:

Fatal error: Call to undefined function: imagecreatefromjpeg() in c:\programmi\easyphp1-7\www\upload_thumbnail\include\image.class.php on line 49

Cosa può essere?

Segnala ad un moderatore | IP: Collegato | Permalink

gasmor è offline Old Post 06-08-2004 17:22
Clicca qui per vedere il profilo dell'utente gasmor Clicca qui per inviare all'utente gasmor un messaggio privato Visualizza ulteriori messaggi scritti dall'utente gasmor Aggiungi l'utente gasmor alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
luca200
Utente di HTML.it



Registrato il: Apr 2002

Provenienza: Bologna

Messaggi: 3327


ICQ : 27143131

MSN :

Skype :


Citazione:
Originariamente inviato da gasmor
Cosa può essere?

Problemi con le librerie GD. Hai l'estensione installata/abilitata?


__________________
...lotterò per te ogni giorno perché questo amore sia eterno..
Cinzia   9-3-1974   27-2-2003

Segnala ad un moderatore | IP: Collegato | Permalink

luca200 è offline Old Post 06-08-2004 19:38
Clicca qui per vedere il profilo dell'utente luca200 Clicca qui per inviare all'utente luca200 un messaggio privato Visualizza ulteriori messaggi scritti dall'utente luca200 Aggiungi l'utente luca200 alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
sko
Utente di HTML.it



Registrato il: Jun 2003

Provenienza: Taranto

Messaggi: 286


ICQ :

MSN :

Skype :


sono riuscito a fare qualche modifica x le mie esigenze...

solo che se non riesco a ridurre la larghezza in caso fosse superiore a x pixel...

suggerimenti?


__________________
Online - Salento Pub
In città la legge sei tu... qui è uTonter
Flickr

Segnala ad un moderatore | IP: Collegato | Permalink

sko è offline Old Post 06-08-2004 21:11
Clicca qui per vedere il profilo dell'utente sko Clicca qui per inviare all'utente sko un messaggio privato Visita l'homepage dell'utente sko Visualizza ulteriori messaggi scritti dall'utente sko Aggiungi l'utente sko alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
gasmor
Utente di HTML.it



Registrato il: Apr 2004

Provenienza: Teramo

Messaggi: 1649


ICQ :

MSN :

Skype :


non sono sicuro di averla, ora controllo.
Grazie per l'aiuto. Ciao

Segnala ad un moderatore | IP: Collegato | Permalink

gasmor è offline Old Post 06-08-2004 23:03
Clicca qui per vedere il profilo dell'utente gasmor Clicca qui per inviare all'utente gasmor un messaggio privato Visualizza ulteriori messaggi scritti dall'utente gasmor Aggiungi l'utente gasmor alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
xPilux
Utente di HTML.it



Registrato il: Jul 2004

Provenienza: Bollate

Messaggi: 104


ICQ :

MSN :

Skype :


visto che stai usando easyphp,
mi sembra che puoi abilitare le estensioni usando il menu
sulla tray icon

Segnala ad un moderatore | IP: Collegato | Permalink

xPilux è offline Old Post 07-08-2004 00:03
Clicca qui per vedere il profilo dell'utente xPilux Clicca qui per inviare all'utente xPilux un messaggio privato Visualizza ulteriori messaggi scritti dall'utente xPilux Aggiungi l'utente xPilux alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Tymba
Utente di HTML.it



Registrato il: Nov 2001

Provenienza: io vengo dalla luna

Messaggi: 566


ICQ :

MSN :

Skype :


per creare una thumb e mantenere le proporzioni:

codice:
<form action="test.php" method="post">
larghezza<br>
<input type="text" name="larghezza"><br>
altezza<br>
<input type="text" name="altezza"><br>
<input type="submit" value="invia">
</form>
<?
	if (isset($_POST['larghezza']))
		$larghezza=$_POST['larghezza'];
	else
		$larghezza=0;	

	if (isset($_POST['altezza']))
		$altezza=$_POST['altezza'];
	else
		$altezza=0;	

	if (($larghezza>400) || ($altezza>400))
		if ($larghezza>$altezza)
		{
			$altezza = $altezza * 400/$larghezza;
			$larghezza = 400;
		}
		else
		{
			$larghezza = $larghezza * 400/$altezza;
			$altezza = 400;
		}
		
		echo "altezza ".$altezza."<br>";
		echo "larghezza ".$larghezza."<br>";		
		
?>

Segnala ad un moderatore | IP: Collegato | Permalink

Tymba è offline Old Post 07-08-2004 07:57
Clicca qui per vedere il profilo dell'utente Tymba Clicca qui per inviare all'utente Tymba un messaggio privato Visita l'homepage dell'utente Tymba Visualizza ulteriori messaggi scritti dall'utente Tymba Aggiungi l'utente Tymba alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
gasmor
Utente di HTML.it



Registrato il: Apr 2004

Provenienza: Teramo

Messaggi: 1649


ICQ :

MSN :

Skype :


si, non erano abilitate e con easyphp è stato semplicissimo.
Ciao a tutti

Segnala ad un moderatore | IP: Collegato | Permalink

gasmor è offline Old Post 07-08-2004 09:08
Clicca qui per vedere il profilo dell'utente gasmor Clicca qui per inviare all'utente gasmor un messaggio privato Visualizza ulteriori messaggi scritti dall'utente gasmor Aggiungi l'utente gasmor alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
xPilux
Utente di HTML.it



Registrato il: Jul 2004

Provenienza: Bollate

Messaggi: 104


ICQ :

MSN :

Skype :


sko, ma esattamente quale è il problema?
ti da qualche errore?
è l'upload che non va o il resize...

Segnala ad un moderatore | IP: Collegato | Permalink

xPilux è offline Old Post 07-08-2004 12:28
Clicca qui per vedere il profilo dell'utente xPilux Clicca qui per inviare all'utente xPilux un messaggio privato Visualizza ulteriori messaggi scritti dall'utente xPilux Aggiungi l'utente xPilux alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
sko
Utente di HTML.it



Registrato il: Jun 2003

Provenienza: Taranto

Messaggi: 286


ICQ :

MSN :

Skype :


Citazione:
Originariamente inviato da xPilux
sko, ma esattamente quale è il problema?
ti da qualche errore?
è l'upload che non va o il resize...



no non dava errori

e che non conosco le classi e nn sapevo come fare la piccola modifica

cmq il problema si verificava quando uno inseriva un immagine lunga 1000px ma alta solo 300px! lasciava la lunghezza di 1000px!
non so se è colpa del tuo script o delle mie modifiche!
cmq grazie ho risolto


__________________
Online - Salento Pub
In città la legge sei tu... qui è uTonter
Flickr

Segnala ad un moderatore | IP: Collegato | Permalink

sko è offline Old Post 07-08-2004 12:50
Clicca qui per vedere il profilo dell'utente sko Clicca qui per inviare all'utente sko un messaggio privato Visita l'homepage dell'utente sko Visualizza ulteriori messaggi scritti dall'utente sko Aggiungi l'utente sko alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
xPilux
Utente di HTML.it



Registrato il: Jul 2004

Provenienza: Bollate

Messaggi: 104


ICQ :

MSN :

Skype :


Ho riprovato il mio script prorpio con un immagine
1000 x 300 e funziona!!
Magari il prob era in qualche tua modifica...

Segnala ad un moderatore | IP: Collegato | Permalink

xPilux è offline Old Post 07-08-2004 13:04
Clicca qui per vedere il profilo dell'utente xPilux Clicca qui per inviare all'utente xPilux un messaggio privato Visualizza ulteriori messaggi scritti dall'utente xPilux Aggiungi l'utente xPilux alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
sko
Utente di HTML.it



Registrato il: Jun 2003

Provenienza: Taranto

Messaggi: 286


ICQ :

MSN :

Skype :


Citazione:
Originariamente inviato da xPilux
Ho riprovato il mio script prorpio con un immagine
1000 x 300 e funziona!!
Magari il prob era in qualche tua modifica...


probabilmente visto che ancora devo studiare le classi..

alla fine ho risolto cosi

codice PHP:

if ($largo>$alto)
   {
      
$div = $largo/MAX_LARGO;
      
$new_alto = $alto/$div;
      
$new_largo=MAX_LARGO ;
    }
    else
      {
       
$div = $alto/MAX_ALTO;
       
$NEW_LARGO = $largo/$div;
       
$NEW_ALTO =300;
       }


per ora funziona


__________________
Online - Salento Pub
In città la legge sei tu... qui è uTonter
Flickr

Segnala ad un moderatore | IP: Collegato | Permalink

sko è offline Old Post 07-08-2004 14:19
Clicca qui per vedere il profilo dell'utente sko Clicca qui per inviare all'utente sko un messaggio privato Visita l'homepage dell'utente sko Visualizza ulteriori messaggi scritti dall'utente sko Aggiungi l'utente sko alla tua lista degli utenti amici Modifica / Cancella il messaggio Rispondi quotando   Torna su
Tutte le ore sono con fuso orario CET. Ora sono le 22:03.    Invia una risposta
Pagine (19): [ 1   2   3   4   5   >   >> ]  Ultima discussione   Prossima discussione
Versione per la stampa | Invia il thread via email | Ricevi aggiornamenti sul thread | Scarica il thread

Vai al forum:
 
Cerca nel thread:

Forum Rules:
Puoi not aprire nuove discussioni
Puoi not rispondere ai messaggi
Puoi not inserire allegati
Puoi not modificare i tuoi messaggi
Il codice HTML è opzione non attiva
Il codice vB è opzione attiva
Le faccine sono opzione attiva
Il codice [IMG] è opzione attiva