Newsgroup: it.comp.www.php
Titolo: Visualizzare immagini da DB

Salve a tutti,
 
ho un DB mysql dove sono memorizzate delle immagini, tramite PHP estraggo
i dati e le visualizzo, tramite la seguente funzione PHP : 
 
//file view.php
<?php
include("connessione_MYSQL.php"); 
 
function resizeImage($src, $imageWidth, $imageHeight, $desiredWidth, 
$desiredHeight) {
  $newWidth = $desiredWidth;
  $newHeight = $desiredHeight;
  $newX = 0;
  $newY = 0;
 
  $scaleFactor = min($desiredWidth / $imageWidth, $desiredHeight / 
$imageHeight);
  $newWidth = ceil($imageWidth * $scaleFactor);
  $newHeight = ceil($imageHeight * $scaleFactor);
  $newX = ($desiredWidth - $newWidth) / 2;
  $newY = ($desiredHeight - $newHeight) / 2;
 
  $imageResized = imagecreatetruecolor($desiredWidth, $desiredHeight);
  $background = imagecolorallocate($imageResized, 255, 255, 255);
  imagefilledrectangle($imageResized, 0, 0, $desiredWidth, $desiredHeight, 
$background);
  imagecopyresampled($imageResized, $src, $newX, $newY, 0, 0, $newWidth, 
$newHeight, $imageWidth, $imageHeight);
 
  return $imageResized;
} 
 
$risultato = mysql_query("select HIGH_PRIORITY image from dati where (codice 
= ".$_GET['codice'].") limit 1;",$connessione) or
   					 die("<br>Impossibile prelevare l'immagine");
 
$riga = mysql_fetch_row($risultato);
 
header("Content-Type: image/pjpeg"); 
 
         if ($riga[0] == '') {
                $im = @imagecreate(200, 200)  or die("Cannot Initialize new 
GD image stream");
                $background_color = imagecolorallocate($im, 249, 246, 
229);//f9f6e5
                $text_color = imagecolorallocate($im, 233, 14, 91);
                imagestring($im, 40, 60, 40,  "Immagine", $text_color);
                imagestring($im, 40, 80, 80,  "Non", $text_color);
                imagestring($im, 40, 50, 120,  "Disponibile", $text_color);
            } else 
                 {  
                 $im = imagecreatefromstring($riga[0]);
 
                 $stamp = imagecreatefrompng('../Immagini/logo_trasp.png');
 
                 $aggiuntaX = (ImageSX($im) <= ImageSX($stamp))?
(ImageSX($stamp)-ImageSX($im)):0;
                 $aggiuntaY = (ImageSY($im) <= ImageSY($stamp))?
(ImageSY($stamp)-ImageSY($im)):0;
 
                 $im2 = 
ImageCreateTrueColor(ImageSX($im)+$aggiuntaX,ImageSY($im)+$aggiuntaY);
                 imagesavealpha($im2, true);
                 $trans_colour = imagecolorallocatealpha($im2, 0, 0, 0, 
127);
                 imagefill($im2, 0, 0, $trans_colour);
 
                 ImageCopy($im2, $im, 0, 0, 0, 0, ImageSX($im), 
ImageSY($im));
 
                 $im = $im2;
                 unset($im2);
                 // Set the margins for the stamp and get the height/width 
of the stamp image
                 $marge_right = 0;
                 $marge_bottom = 0;
                 $sx = imagesx($stamp);
                 $sy = imagesy($stamp);
 
                 imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, 
imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
 
                 }                 
 
                 if (isset($_GET['resizeX']) && isset($_GET['resizeY']))
                  {                    
                    $thumbnail = resizeImage($im, imagesx($im), 
imagesy($im), $_GET['resizeX'],$_GET['resizeY']);
                    imagepng($thumbnail);
                    imagedestroy($thumbnail);
                   }
                 else
                  {
                    imagepng($im);
                    imagedestroy($im);
                  }    
 
                 flush();
 
 mysql_close($connessione);          
?>
 
 
mentre nella pagina inserisco il codice :
 
//file index.php
...
<img src='view.php?codice=09425&resizeX=160&resizeY=160'>
...
 
Sul mio computer locale, tutto funziona correttamente, mentre, quando
carico la pagina dal server remoto, se ci sono molte
immagini da caricare, vengono visualizzate solo alcune (le prime sempre), la 
mia impressione è che ci sia un timeout, ovvero quelle che riesce a caricare 
in un certo tempo, vengono visualizzate, le altre no.
 
provate a vedere il seguente link:
http://www.ferramentatodisco.it/search_articolo.php?precodice=alfer
 
 
come posso risolvere questa situazione?
-- 
www.ferramentatodisco.it
 
Rivenditore Milwaukee, Aeg, Usag, Elematic, Rover, Krino.
 

 come posso risolvere questa situazione?
 
Anche a me succede piu' o meno la stessa cosa, quindi mi unisco alla tua richiesta di aiuto.


 
Da una mia esperienza personale, la soluzione di mettere le immagini nel 
db è da scartare (non a priori, ma quasi).
I problemi sono:
- eccessiva lentezza nel recuperare le immagini
- eccessivo peso del db quando le immagini sono tante;
- backup del db quasi impossibile.
 
In più tu fai un resize on-the-fly di ogni immagine che ti serve (che 
per il server è un lavoro non da poco, specie se sei in condominio con 
altri).
 
Quello che ti consiglio è:
- immagini su filesystem;
- quando le carichi fai il resize in tutte le dimensioni che ti servono;
- quando le prendi, prendi direttamente il file già ridimensionato; in 
questo modo puoi anche fare affidamento su sistemi di caching per la 
parte statica (le immagini).
In più, pagine molto lunghe con molte immagini richiedono tempi di 
trasmissione non indifferenti: valuta se è il caso di mettere le 
immagini su un server con un dominio separato, o modificare il layout 
della pagina (mostrando ad esempio una lista senza immagini, ma con solo 
una icona "macchina fotografica" 30x30 che poi una volta cliccata porta 
al dettaglio).
 
 


 
Ritengo sia sbagliato mettere immagini direttamente nel DB.
(lentezza nel rileggere immagini, eccessivo peso del db ecc.)
Se ogni record corrisponde a una immagine è meglio caricare le immagini 
direttamente sul server in una apposita cartella (con il pulsante 
sfoglia tanto per capirsi.)
Durante questo tipo di caricamento le fai dimensionare e gli cambi nome 
dando per nome ad ogni immagine lo ID del record.
Nella loro rilettura, basta un link dalla pagina dove rileggi le 
immagini alla cartella che le contiene ed il gioco è fatto.
 
Nel caso ogni pagina contenga più immagini ti conviene fare una 
sottotabella nel db, Questa sottotabella deve avere un id unico per ogni 
record che corrisponderà all'immagine (come scritto per il caso 
precedente) ed un id secondario che deve corrispondere all'ID primario 
della tabella madre.
Cosi quando leggi la tabella principale, con una query con l'ID del 
record ottieni tutte le immagini corrispondenti che si trovano nella 
tabella secondaria.
Naturalmente, in entrambi i casi la didascalia dell'immagine la metti in 
un campo del record corrispondente all'immagine.
Saluti
Leonardo
 
 
 
 
 
 
-- 
Non sono su facebook
Se anche tu vuoi cancellarti
http://www.giardiniblog.com/come-cancellarsi-da-facebook-eliminare-account/
 

 - eccessivo peso del db quando le immagini sono tante;
 
Concordo, la scelta di usare il DB per memorizzare tutto, nasce
dal fatto che il gestionale, memorizza già le immagini in un DB,
e quindi è + semplice copiare una tabella, anziché fare + operazioni,
per estrarre dati e immagini, ma se non trovo una soluzione,devo 
rassegnarmi.
 
Grazie



In modo grossolano: puoi pensare di estrarre tutte le immagini e 
metterle sul filesystem. Devi solo trovare un modo per sapere quando una 
immagine viene aggiunta od aggiornata nel db.
Oppure ti fai tu una cache, quando devi includere una immagine la 
ridimensioni e la parcheggi sul filesystem, ma prima di estrarla 
controlli di non averlo già fatto: se l'hai già fatto, prendi quella 
dalla cache.


 
Mi unisco al coro
Mettere le immagini nel DB è il tipico esempio del "mettere il culo 
nelle pedate"
 
Se non hai motivi estremamente precisi e validi per metterle lì mettile 
sul filesystem, sul db ne archivi i metadati (path, alt, titolo, nome .... )
 
P.S.
Il risultato netto dell'aver lasciato che fosse il mago Zurlì a 
progettare quel sito è che avete messaggi di questo genere:
 
 
Warning: mysql_connect() [function.mysql-connect]: Lost connection to 
MySQL server at 'reading initial communication packet', system error: 
111 in 
/home/mhd-01/
www.ferramentatodisco.it/htdocs/Librerie/connessione.php
 on 
line 3
Connessione non riuscita: Lost connection to MySQL server at 'reading 
initial communication packet', system error: 111
 
-- 
I fatti mi cosano


P.S.
Ma hai speso due secondi a guardare che succede con qualsiasi tool 
integrato (c'è su Firefox, su Chromium, perfino su Exploder)?
 
Le immagini non caricate hanno tutte questa bella risposta:
HTTP/1.1 509 Rate Limit Exceeded
Date: Thu, 05 Sep 2013 13:56:50 GMT
Server: Apache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 41
Keep-Alive: timeout=2, max=99
Connection: Keep-Alive
Content-Type: text/plain
 
Quando l'analisi e l'implementazione sono al top ovviamente anche 
l'hosting è al top
Smettete di farvi fare i lavori da Briatore và ...


(lentezza nel rileggere immagini, eccessivo peso del db ecc.)
 
Ci sono dei pro e dei contro. Avere i file esterni consente di servire le
immagini come contenuto statico. Pero' gestire i file diventa complesso -
per esempio, se cancelli un record, devi gestire l'eliminazione dei file.
 
E il backup lo devi fare in due "tranche", DB e immagini.
 
Leonardo
 
-- 
 
Then felt I like some watcher of the skies, when a new planet swims into his ken;
Or like stout Cortez when with eagle eyes, he star'd at the Pacific; and all his men
Look'd at each other with a wild surmise - silent, upon a peak in Darien.


 
Ottima puntualizzazione, in pratica dipende tutto da che applicazione si 
vuole avere e come la si puņ o vuole gestire.
Ti ringrazio.
Leonardo.
