visualizzare le immagini da db

marcocampoli

Nuovo Utente
26 Nov 2010
1
0
0
Salve a tutti.
Ho un problema con la visualizzazione. Le immagini sono caricate in un DB (il tipo usato è LONGBLOB).
Ho letto una guida che parla degli inserimenti ne DB, ed ho appreso che le cose fondamentali da fare sono pressochè 3:
1) (ovviamente) il reupero del file: $img= $_FILE['form']['tmp_name'];
2) uso della funzione file_get_contents($img);
3) uso della funzione addslashes($img);

Fin qui non ho problemi....Nel momento in cui vado a recuperare, un immagine precedentemente inserita, invece di visualizzare le immagini, visualizza una serie di codici (penso che sia l'immagine sottoforma di codice binario)......Penso che questo sia normale, perchè ho inserito nel
DB un file in formato binario....
Per visualizzare l'immagine non ho potuto segure la guida, poichè essa tratta la visualizzazione di una sola immagine
(infatti l'HEADER("CONTENT-TYPE: IMAGE/JPEG"); )
Sono giorni che cerco una soluzione......qualcuno di voi può aiutarmi???
 
togli i tag
<html><head.....
probabilmente se fai il var_dump... risulta string.
lascia solo da <?php a ?>
 
Ultima modifica:
ciao
io c'ho rinunciato.
invece dell'immagine (campo blob) metti solo il nome del file immagine e l'immagine la carichi in una cartella a piacere e poi quando la estrai la richiami col semplice src
eviti cosi tutti i problemei di header (ce spesso non sono pochi)
 
Anche a me mi si era presentato lo stesso problema e ricordo che era causato dai tag <html>...<body>Invece (bisogna incollare proprio come scritto nella guida) cioè dal tag <?php a ?>

Cmq alla fine anche io ho fatto come dice Borgo Italia! utilizzando una cartella csfruttando il database solo per il nome dell'img...

io ho fatto così:

p.s. ho saltato la parte dell'insrimento dell'img tramite form
PHP:
//ottengo la dimensione dell'img e se superiore sia in larghezza che in altezza di 400px
//termita comunicando che le dimensioni sono troppo grandi

$size = getimagesize($_FILES['userfile']['tmp_name']); 
$height = $size[1]; 
$width = $size[0];
if($width >400 || $height > 400){
 exit("errore dimensioni grandi");
}




//preparo la stringa per l'inserimento

$piccola=htmlspecialchars(trim(($_POST['nome_pic'])));
$insertSQL = "INSERT INTO foto (descrizione,nome_piccola) VALUES ('".htmlspecialchars($_POST['descrizione'])."','$piccola')";

//mi connetto
include "connetti.php";

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

$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           
|p.s. sullo spazio web se usi un server win devi f        
|arlo con una cartella predefinita tipo public               
|Se usi Linux devi abilitare i permessi                        
+---------------------------------------------------+
****/

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

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


if ($inviato) {
//se $inviato è true allora sposta il file dentro la cartella
 move_uploaded_file($file_temp,$nuovo_nome);


}

Il fatto è che questo sistema è buono per applicazioni semplici - se andiamo sul complesso bisogna imparare a sfruttare per forza di cose il db - ma ancora non ho trovato uno script buono

p.s. questo codice si trova online io l'ho leggermente personalizzato - il file in questo caso ha sempre un'estensione .jpg
 
Ultima modifica:
Basta salvare MIME type e contenuto dell'immagine nel database all'atto dell'inserimento, e creare una pagina chiamata ad esempio image.php, contenente:
PHP:
<?php
// gli errori non devono essere visualizzati in questa pagina
error_reporting(0);

// effettuo la connessione al database
$conn = mysql_connect('localhost', 'root') or die();
mysql_select_db('galleria', $conn) or die();

// recupero l'ID richiesto
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;

// recupero i dati dalla tabella
$query = mysql_query("SELECT * FROM foto WHERE id = {$id}") or die();

// controllo che l'immagine esista
if(mysql_num_rows($query) == 1)
{
	// salvo le informazioni in un array
	$data = mysql_fetch_assoc($query);
	
	// invio l'header del MIME type
	header("Content-type: {$data['mime_type']}");
	
	// visualizzo i contenuti dell'immagine
	echo $data['image_contents'];
}
else
{
	// invio un errore 404
	header('HTTP/1.1 404 Not Found');
}
?>
E poi richiamarla così:
HTML:
<img src="image.php?id=1" />
Ovviamente con l'ID desiderato. Visto? Più facile di così...
 
Ottima soluzione Alex, bisognerebbe però bypassare quel:
PHP:
error_reporting(0);
perché nascondere gli errori invece di eliminarli non è una buona pratica.
 
ciao

PHP:
header("Content-type: {$data['mime_type']}");

il problema è proprio li, la pag che ha quell'header o fa vedere l'immagini o fa casino con i testi o viceversa.
inoltre (ma di questo non sono sicuro perche non avendo più usato quel sistema non so se i vari bw si sono aggiornati) c'è il problema del Content-Type octet-stream (o octetstream come preferisce, per oscure ragioni, Internet Explorer)
 
Per quanto riguarda la visualizzazione degli errori, in ambiente di produzione è sconsigliata, e a maggior ragione in un file che dovrebbe visualizzare solamente immagini.

@borgo: non c'è nessunissimo problema con gli header, perché quella pagina contiene solo quel codice, quindi non può restituire un errore relativo alla modifica degli header.
 
@alex
io non parlavo di errore di heder, ma sul fatto che se nella pagina in cui visualizzi la foto c'è anche del testo, con l'eder per l'immagine non visualizzi il testo, se metti l'header per il testo l'immagine la visualizzi con "la serie di caratteri strani".
 
Non capisco qual è il tuo problema. Se hai una pagina contenente il codice che ho fornito poi puoi creare una pagina HTML con dentro quello che vuoi in cui visualizzare l'immagine. Ad esempio:
HTML:
<h1>Mia immagine</h1>
<img src="image.php?id=1" />
<p>Questa &egrave; un'immagine.</p>
 
ciao
proverò il tuo script, anche se ormai tutte le mie gallerie sono fatte nel sistema con link nel db e foto in cartella.
ti dicevo questo perchè seguendo quanto scritto negli articoli mrwm (ed anche in quelli della concorrenza) il risultato è sempre stato lo stesso
 
Ciao

Basta salvare MIME type e contenuto dell'immagine nel database all'atto dell'inserimento, e creare una pagina chiamata ad esempio image.php, contenente:
PHP:
<?php
// gli errori non devono essere visualizzati in questa pagina
error_reporting(0);

// effettuo la connessione al database
$conn = mysql_connect('localhost', 'root') or die();
mysql_select_db('galleria', $conn) or die();

// recupero l'ID richiesto
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;

// recupero i dati dalla tabella
$query = mysql_query("SELECT * FROM foto WHERE id = {$id}") or die();

// controllo che l'immagine esista
if(mysql_num_rows($query) == 1)
{
	// salvo le informazioni in un array
	$data = mysql_fetch_assoc($query);
	
	// invio l'header del MIME type
	header("Content-type: {$data['mime_type']}");
	
	// visualizzo i contenuti dell'immagine
	echo $data['image_contents'];
}
else
{
	// invio un errore 404
	header('HTTP/1.1 404 Not Found');
}
?>
E poi richiamarla così:
HTML:
<img src="image.php?id=1" />
Ovviamente con l'ID desiderato. Visto? Più facile di così...

Ciao Ale,

So che la discussione è vecchiotta, ma mi puoi mandare lo script che avevi realizzato delle immagini ??? Ho visto che ti eri impegnato a farlo. Grazie.
 

Discussioni simili