Come posso archiviare e recuperare immagini da un database MySQL usando PHP?
Domanda
Come posso inserire un'immagine in MySQL e poi recuperarla usando PHP?
Ho un'esperienza limitata in entrambe le aree e potrei usare un piccolo codice per iniziare a capirlo.
Soluzione
Per prima cosa crei una tabella MySQL per archiviare immagini, come ad esempio:
create table testblob (
image_id tinyint(3) not null default '0',
image_type varchar(25) not null default '',
image blob not null,
image_size varchar(25) not null default '',
image_ctgy varchar(25) not null default '',
image_name varchar(50) not null default ''
);
Quindi puoi scrivere un'immagine nel database come:
/***
* All of the below MySQL_ commands can be easily
* translated to MySQLi_ with the additions as commented
***/
$imgData = file_get_contents($filename);
$size = getimagesize($filename);
mysql_connect("localhost", "$username", "$password");
mysql_select_db ("$dbname");
// mysqli
// $link = mysqli_connect("localhost", $username, $password,$dbname);
$sql = sprintf("INSERT INTO testblob
(image_type, image, image_size, image_name)
VALUES
('%s', '%s', '%d', '%s')",
/***
* For all mysqli_ functions below, the syntax is:
* mysqli_whartever($link, $functionContents);
***/
mysql_real_escape_string($size['mime']),
mysql_real_escape_string($imgData),
$size[3],
mysql_real_escape_string( Per prima cosa crei una tabella MySQL per archiviare immagini, come ad esempio:
create table testblob (
image_id tinyint(3) not null default '0',
image_type varchar(25) not null default '',
image blob not null,
image_size varchar(25) not null default '',
image_ctgy varchar(25) not null default '',
image_name varchar(50) not null default ''
);
Quindi puoi scrivere un'immagine nel database come:
$link = mysql_connect("localhost", "username", "password");
mysql_select_db("testblob");
$sql = "SELECT image FROM testblob WHERE image_id=0";
$result = mysql_query("$sql");
header("Content-type: image/jpeg");
echo mysql_result($result, 0);
mysql_close($link);
È possibile visualizzare un'immagine dal database in una pagina Web con:
<*>FILES['userfile']['name'])
);
mysql_query($sql);
È possibile visualizzare un'immagine dal database in una pagina Web con:
<*>Altri suggerimenti
Invece di archiviare immagini nel database, archiviarle in una cartella sul disco e archiviarne la posizione nella base di dati.
Attenzione che la pubblicazione di immagini da DB è in genere molto, molto molto più lenta rispetto alla pubblicazione su disco.
Inizierai un processo PHP, aprendo una connessione DB, facendo in modo che il DB legga i dati delle immagini dallo stesso disco e RAM per la cache del filesystem, trasferendoli su pochi socket e buffer e poi spingendo fuori tramite PHP, che per impostazione predefinita lo rende non memorizzabile nella cache e aggiunge il sovraccarico della codifica HTTP in blocco.
I moderni server Web OTOH possono servire immagini con solo poche chiamate del kernel ottimizzate (file mappato in memoria e quell'area di memoria passata allo stack TCP), in modo che non copino nemmeno la memoria e quasi non ci sia sovraccarico.
Questa è una differenza tra la possibilità di servire 20 o 2000 immagini in parallelo su una macchina.
Quindi non farlo a meno che tu non abbia assolutamente bisogno dell'integrità transazionale (e in realtà anche questo può essere fatto con solo metadati di immagine in routine di pulizia di DB e filesystem) e sai come migliorare la gestione di HTTP da parte di PHP per essere adatto per le immagini.
Consiglio anche di pensarci su questo e poi di scegliere di memorizzare le immagini nel tuo file system piuttosto che nel DB .. vedi qui: Archiviazione di immagini in DB - Sì o No?
La mia opinione è, invece di archiviare le immagini direttamente nel database, si consiglia di memorizzare la posizione dell'immagine nel database. Confrontando entrambe le opzioni, l'archiviazione delle immagini nel database è sicura per motivi di sicurezza. Lo svantaggio è
-
Se il database è danneggiato, non è possibile recuperarlo.
-
Il recupero dei file di immagine da db è lento se confrontato con un'altra opzione.
D'altra parte, la memorizzazione della posizione del file immagine in db avrà i seguenti vantaggi.
-
È facile da recuperare.
-
Se sono memorizzate più immagini, possiamo recuperare facilmente le informazioni sull'immagine.
Personalmente non vorrei memorizzare l'immagine nel database, invece inserirla in una cartella non accessibile dall'esterno e utilizzare il database per tenere traccia della sua posizione. mantiene ridotte le dimensioni del database e puoi semplicemente includerlo utilizzando PHP. Non ci sarebbe modo senza PHP di accedere a quell'immagine