Memorizzare e richiamare immagini da un Database MySql

Posted on agosto 21, 2008
Filed Under Gallery Immagini | 4 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

4 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’)”);

Leave a Reply