Page 1 sur 1

Extraction images jpeg sur le disque depuis blob

Posté : 14 août 2012, 10:04
par amacquet
Bonjour,

je tente de recréer des fichiers jpeg stockés sous forme de blob dans une base mysql.

J'utilise le script suivant :

Code : Tout sélectionner

$requete_photos="select id, photo_blob from table"; $location="export/"; $rs = mysql_query($requete_photos); while ($row=mysql_fetch_object($rs)) { $filename=$location.$row->id.".jpg"; $file=fopen($filename,'w'); $blob= $row->photo_blob; if (fwrite($file,$blob)) { echo "<img src='".$filename."'><br />"; } fclose($file); }
Les fichiers jpeg sont bien créés dans le répertoire, mais aucun logiciel ne parvient à afficher ces images, il doit me manquer quelque chose...

Quelqu'un peut-il me venir en aide ? D'avance merci

Re: Extraction images jpeg sur le disque depuis blob

Posté : 14 août 2012, 10:27
par Mazarini
Au lieu d'écrire dans un fichier, tu peux faire un echo du blob pour 1 seule image et en le faisant précéder d'un header() pour indiquer le type mime du fichier.

A priori, je pense que le stockage dans la base a endommagé le contenu du fichier. Magic quote ou autre modification ? Rien ne me semble poser de problème dans ton code. A moins que les fichiers ne soit pas en jpg mais en gif ou autre.

Edit : pour info, header('Content-Type: image/jpeg');

Re: Extraction images jpeg sur le disque depuis blob

Posté : 14 août 2012, 10:56
par amacquet
salut,

j'ai essayé ça :

Code : Tout sélectionner

$requete_photos="select photo_blob from table"; $rs = mysql_query($requete_photos); $row=mysql_fetch_object($rs); $blob= $row->photo_blob; // Preparing HTTP response headers... header('Pragma: public'); header('Content-Type: image/jpeg'); $etag = '"' . md5($blob) . '"'; header('ETag: ' . $etag); $expires = 2592000; // 1 month of cache validity. header('Cache-Control: maxage=' . $expires); header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires) . ' GMT'); // Checking if the cache of the client is up-to-date or not... $requestHeaders = getallheaders(); if (array_key_exists('If-None-Match', $requestHeaders) && ($requestHeaders['If-None-Match'] === $etag)) { header('HTTP/1.0 304 Not Modified'); flush(); exit; } // Stops output buffering... ob_implicit_flush(); ob_end_flush(); // Sending HTTP response headers... flush(); if ($blob !== '') { echo $blob; } else { echo "erreur"; } flush();
et j'obtiens le message suivant :

"l'image display_photo.php ne peut être affichée car elle contient des erreurs"
A priori, je pense que le stockage dans la base a endommagé le contenu du fichier
Y a-t-il un moyen de vérifier cela ?

Re: Extraction images jpeg sur le disque depuis blob

Posté : 14 août 2012, 11:00
par amacquet
Si cela peut aider, voici la fonction avec laquelle les photos d'origine ont été stockées dans la base :

Code : Tout sélectionner

function upload_photo ($matricule){ $ret = false; $img_blob = ''; $img_taille = 0; $img_type = ''; $img_nom = ''; $taille_max = 10000000; $ret = is_uploaded_file ($_FILES['fic']['tmp_name']); if ( !$ret ) { echo "Problème de transfert"; return false; } else { // Le fichier a bien été reçu $img_taille = $_FILES['fic']['size']; if ( $img_taille > $taille_max ) { echo "Trop gros !"; return false; } $img_type = $_FILES['fic']['type']; $img_nom = $_FILES['fic']['name']; // $img_blob = file_get_contents ($_FILES['fic']['tmp_name']); // TRAITEMENT DE L'IMAGE /////////////////////////////////////////////////////////////////// $filename = $_FILES['fic']['tmp_name']; $file_dest = "./photos_agents/".$matricule.".jpg"; // on charge l'image originale dans la variable $ori $ori = imagecreatefromjpeg($filename); // on retourne l'image à 90° $ori_rotate = imagerotate($ori,90,0); // on créé la nouvelle image en 480 par 600 $dest = imagecreatetruecolor (480,600); // ensuite on copie une partie de l'image ori dans l'image dest imagecopyresampled($dest,$ori_rotate,0,0,0,0,480,600,480,600); // on sauvegarde alors la nouvelle image imagejpeg($dest,$file_dest); // destruction des images imagedestroy($ori); imagedestroy($ori_rotate); imagedestroy($dest); // ////////////////////////////////////////////////////////////////////////////////////////// $img_blob = file_get_contents ($file_dest); $req = "UPDATE agent SET photo_nom = '".$img_nom."', photo_taille = '".$img_taille."', photo_type = '".$img_type."', photo_blob = '".addslashes($img_blob)."' WHERE id_agent=".$_POST['id_agent'].""; // print_r($req); // echo "<br><br><br>"; // print_r($_FILES); $ret = mysql_query ($req) or die (mysql_error ()); return true; } }
c'est pas le addslashes dans :
photo_blob = '".addslashes($img_blob)."'

qui me pose problème dans la restitution ?

Re: Extraction images jpeg sur le disque depuis blob

Posté : 14 août 2012, 11:15
par Mazarini
Si tu peux refaire un chargement de fichier jpg, fais le et compare le fichier recréé avec le fichier original.
Pour analyser les erreurs, il te faudra faire des recherches pour avoir la structure d'un fichier jpg.

En dehors de trouver une solution pour stocker tes fichiers dans un blob et le relire sans problème, je doute que tu puisse récupérer tes fichiers. A priori, stocker des images dans une base n'est pas un bonne idée (même s'il m'arrive de le faire). Je ne stocke mes fichiers en base par un "bind" de paramètre (http://fr2.php.net/manual/fr/pdostateme ... column.php)

Le plus sérieux pour stocker des images est d'utiliser une base avec id / nom de fichier et d'utiliser une arborescence avec l'id pour nommer le fichier. Pour ne pas avoir de problèmes avec cette arborescence, tu peux transformer le nom de fichier en répertoires. Pour un id 123456789, j'utilise 123/123456/123456789.jpg comme structure pour ne pas avoir des répertoires avec trop de fichiers à l'intérieur.

Edit : la ligne photo_blob = '".addslashes($img_blob)."' me semble la source de tes problèmes.

Re: Extraction images jpeg sur le disque depuis blob

Posté : 14 août 2012, 11:37
par amacquet

Code : Tout sélectionner

la ligne photo_blob = '".addslashes($img_blob)."' me semble la source de tes problèmes.
Probablement...

J'ai essayé de récupérer le blob comme ça :

$blob= stripcslashes($row->photo_blob);

et comme ça :

$blob= stripslashes($row->photo_blob);

sans plus de succès.

J'ai l'impression que je ne parviendrai pas à récupérer les photos depuis la base, à moins que tu n'aies une autre suggestion...

Re: Extraction images jpeg sur le disque depuis blob

Posté : 14 août 2012, 14:56
par Mazarini
je ne pense pas que ce soit possible.
Si tu veux stocker du binaire dans une table, je pense que le bind de variables (en utilisant pdo) est la seul solution. cf http://fr2.php.net/manual/fr/pdostateme ... column.php

Re: Extraction images jpeg sur le disque depuis blob

Posté : 14 août 2012, 16:48
par moogli
salut,

utilise le fichier php directement dans le navigateur si phpp doit afficher une erreur tu la verra tu peux aussi mettre les header en commentaire pour voir le contenu du fichier.

si les magic_quote sont / étaient activé lors de l'insertion il est possible que tu ai plus d'un \ . dans ce cas c'est la loose ;)

le problème est le même si magic_quote_sysbase et activé ;) (ajoute de \ dans le sens fichiers / sgbd => php, alors que les magic_quote c'est php => fichier / SGBD).

Il faut quetu compare ce que tu obtient avec ce que tu veux, sans cela tu ne pourras aller loin.

@+