Memorizzare e richiamare immagini da un Database MySql

Posted on agosto 21, 2008
Filed Under Gallery Immagini | 10 Comments

In questo articolo capiremo come permettere agli utenti l’upload di immagini su siti che non permettono l’accesso in scrittura sul filesystem agli script PHP; andremo a memorizzare le immagini all’interno di una tabella di un Database MySql con opportuni accorgimenti e la richiameremo con uno script direttamente dal tag “<img src”.

Innanzitutto occorre predisporre una tabella per inserire le immagini. Questo il codice MySql per la creazione della tabella all’interno del vostro Database:

CREATE TABLE `uploadimg` (
`key_img` int(11) NOT NULL auto_increment,
`codImg` blob NOT NULL,
PRIMARY KEY (`key_img`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

Come si vede il tipo di campo utilizzato per memorizzare le immagini e’ BLOB ma puo’ anche essere utilizzato il LARGEBLOB. Una volta creata la tabella occorre creare un file di esempio con un form contenente il form da utilizzare per l’upload come ad esempio questo:

uploadImg.php

<html>
<head>
<title>Upload Img in DB (table TEST)</title>
</head>
<body>
<form action=”completeUpload.php” method=”post” enctype=”multipart/form-data“>
<input type=”file” name=”fotoUno”/>
<input type=”submit” value=”INVIA” />
</form>
</body>
</html>

Da notare il tipo di encode utilizzato (mutipart/form-data) e, ovviamente, il tipo di elemento utilizzato per l’upload (file). Questo il file completeUpload.php:

<?php
include (“configuration/database.php”);

$file_path = $_FILES[‘fotoUno’][‘tmp_name’];
$table = “uploadimg”;
$codImg = base64_encode(file_get_contents($file_path));

$sql = @mysql_query(“INSERT INTO $table (key_img, codImg) VALUES (”,’$codImg’))”;

?>

L’utilizzo dell’encode base64 permette di evitare spiacevoli inconvenienti con script in PHP durante il caricamento nel database e la successiva lettura perche’ potrebbero essere presenti dei codici interpretati erroneamente dallo script. Il file database.php presente all’interno della directory configuration e’ lo script di connessione al database cosi’ fatto:

database.php

<?php

$dbhost = ‘localhost’;
$dbusername = ‘root’;
$dbpasswd = ”;
$database_name = ‘test’;
$connection = mysql_connect(“$dbhost”,”$dbusername”,”$dbpasswd”) or die (“Impossibile collegarsi al server.”);
$db = mysql_select_db(“$database_name”, $connection) or die(“Impossibile selezionare il database.”);
?>

Navigando con il nostro browser sulla pagina uploadImg.php andiamo a caricare l’immagine; dovremo trovare il contenuto della stessa nel database.

Abbiamo quindi completato la prima parte relativa al caricamento. Andiamo adesso a leggere l’immagine. Questa una pagina di esempio: mostraImmagine.php

<html>
<head>
<title>Mostra Immagine dal DB</title>
</head>
<body>
<img src=”mostraImg.php?id=1″ />
</body>
</html>

Viene richiamato uno script PHP che cambiando l’header mostrera’ l’immagine scelta. Questo il codice di mostraImg.php:

<?php
include (“configuration/database.php”);
$imageID = $_GET[‘id’];

$sql = @mysql_query(“SELECT * FROM uploadimg WHERE key_img =’$imageID’”);
$dati = mysql_fetch_array($sql);

$img = $dati[‘codImg’];
header(‘Content-type: image/jpeg’);
echo base64_decode($img);
exit;
?>

L’immagine viene decodificata e mostrata sul browser che ne fa richiesta.

Others Script adv

10 Responses to “Memorizzare e richiamare immagini da un Database MySql”

  1. pista on marzo 3rd, 2009 11:25

    ciao

  2. Christian on luglio 25th, 2009 15:14

    ciao, c’è un errore nel codice…

    qua:

    $sql = @mysql_query(”INSERT INTO $table (key_img, codImg) VALUES (”,’$codImg’)”

    non chiudi la parentesi dell’istruzione e di conseguenza ricevi un errore

  3. leofire on agosto 1st, 2009 15:47

    Esatto Christian! Grazie per la segnalazione; ho aggiornato il post.

  4. francesco on novembre 22nd, 2009 22:53

    con questa modifica non ho nessun errore:

    $sql = @mysql_query(“INSERT INTO $table (key_img, codImg) VALUES (‘$codImg’)”);

  5. Fabio on febbraio 12th, 2011 20:06

    Ciao
    a me esce questo errore:

    Warning: file_get_contents() [function.file-get-contents]: Filename cannot be empty in /home/guidespa/public_html/completeUpload.php on line 5

    mi potete aiutare?

    Grazie

  6. leofire on marzo 18th, 2011 12:08

    Dovremo vedere lo script per capire l’errore cosi’ ci dice poco…
    Buon lavoro!

  7. daniele on marzo 20th, 2013 17:07

    Ciao ,innanzi tutto grazie per la guida che nonostante sia datata mi è stata utile per riuscire a visualizzare la mia immagine che ho messo nel database …..pero ho un problemino ……vorrei visualizzare una serie di immagini di un determinato utente e dalla select filtro l’id utente ,pero poi se voglio visualizzare le immagini legate all’utente mi fa vedere solo la prima , ho provato con array e while ,ma senza risultato ….
    Spero che nonostante siano passati anni rieca ad avere un indicazione …..ciao a presto e grazie per il lavoro 🙂

  8. leofire on aprile 25th, 2013 10:52

    Ciao Daniele,

    sinceramente sconsigliamo il salvataggio delle immagini in database perche’ troppo lente da recuperare. Meglio un classico salvataggio nella cartella dedicata alle immagini.
    Penso che ad oggi avrai gia’ risolto il tuo problema, altrimenti passaci la parte di codice che utilizzi che la analizziamo insieme.
    Buon lavoro

  9. Marco on dicembre 11th, 2013 14:28

    Ma perché tutti a dire “memorizzare immagini sul database è sconsigliato perché lo rallenta”? Non c’è cosa più sbagliata. Nel campo blob non viene memorizzato altro che l’indirizzo di memoria che punta al file immagine. E poi, realizzare uno script che memorizza immagini su filesystem su WINDOWS… è da folli. Prima cosa perché Windows non permette una gestione di permessi tramite script (parlo di PHP), seconda cosa perché sarebbe folle andare a cambiare manualmente i permessi sulle immagini se si gestiscono una grande quantità di file.
    Per cortesia, smettiamo di generalizzare tutto. Non tutti usano Linux e se si vuole realizzare un DB locale con Windows, perché non gestire i file nel database? Perché tutti dicono la stessa affermazione (sbagliata)?

  10. luca on ottobre 21st, 2014 08:24

    Ciao, tutto funziona benone tranne che l’ultimo script di visualizzazione delle immagini blob sul browser. Dice l’immagine non può essere visualizzata perchè contiene degli errori. Strano tutto il resto funziona compreso l’inserimento di nuove immagini. Grazie

Leave a Reply