web-dev-qa-db-fra.com

Comment puis-je stocker et récupérer des images d'une base de données MySQL en utilisant PHP?

Comment puis-je insérer une image dans MySQL puis la récupérer en utilisant PHP?

J'ai une expérience limitée dans les deux domaines, et je pourrais utiliser un petit code pour me permettre de commencer à comprendre cela.

58
Mask

Tout d'abord, vous créez une table MySQL pour stocker des images, comme par exemple:

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 ''
);

Ensuite, vous pouvez écrire une image dans la base de données comme:

/***
 * 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($_FILES['userfile']['name'])
    );
mysql_query($sql);

Vous pouvez afficher une image de la base de données dans une page Web avec:

$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);
121
Andomar

Au lieu de stocker des images dans une base de données, stockez-les dans un dossier de votre disque et stockez leur emplacement dans votre base de données.

22
Ankit Sharma

Attention, le fait de servir des images à partir d'une base de données est généralement beaucoup, beaucoup beaucoup plus lent que de les servir à partir d'un disque.

Vous allez commencer un processus PHP, ouvrir une connexion à une base de données, faire en sorte que la base de données lise les données image du même disque et RAM pour le cache comme le système de fichiers le ferait), en le transférant sur quelques sockets et tampons, puis en le déplaçant via PHP, ce qui le rend par défaut impossible à mettre en cache et ajoute une surcharge de codage HTTP fragmenté.

Les serveurs Web modernes OTOH peuvent servir des images avec seulement quelques appels de noyau optimisés (fichier mappé en mémoire et cette zone mémoire passée à la pile TCP)], de sorte qu'ils ne copient même pas la mémoire et il y a presque pas de frais généraux.

C'est une différence entre pouvoir servir 20 ou 2000 images en parallèle sur une seule machine.

Donc ne le faites pas sauf si vous avez absolument besoin d'intégrité transactionnelle (et même cela peut être fait avec juste des métadonnées d'image dans des routines de nettoyage de systèmes de fichiers) et de savoir comment améliorer le traitement de HTTP par HTTP pour convenir pour les images.

9
Kornel

je recommande également de penser à cela, puis de choisir de stocker les images dans votre système de fichiers plutôt que dans la base de données .. voir ici: Stockage d'images dans DB - oui ou non?

6
Scott Evernden

Mon opinion est la suivante: au lieu de stocker des images directement dans la base de données, il est recommandé de stocker l'emplacement de l'image dans la base de données. Alors que nous comparons les deux options, le stockage des images dans la base de données est sécurisé pour des raisons de sécurité. Les inconvénients sont

  1. Si la base de données est corrompue, aucun moyen de récupérer.

  2. La récupération des fichiers image de la base de données est lente par rapport à une autre option.

D'autre part, l'enregistrement de l'emplacement du fichier image dans la base de données présente les avantages suivants.

  1. Il est facile à récupérer.

  2. Si plusieurs images sont stockées, nous pouvons facilement récupérer les informations sur l'image.

6
Gunaseelan

Personnellement, je ne voudrais pas stocker l'image dans la base de données, mais la placer dans un dossier inaccessible de l'extérieur et utiliser la base de données pour garder une trace de son emplacement. maintient la taille de la base de données et vous pouvez simplement l'inclure en utilisant PHP. Il n’y aurait aucun moyen sans PHP d’accéder à cette image alors

4
exussum