Memorizzare e richiamare immagini da un Database MySql

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.

10 pensieri riguardo “Memorizzare e richiamare immagini da un Database MySql”

  1. 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

  2. con questa modifica non ho nessun errore:

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

  3. 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

  4. 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 🙂

  5. 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

  6. 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)?

  7. 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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *