Image dans un champ BLOB sous MySQL ???

Image dans un champ BLOB sous MySQL ??? - PHP - Programmation

Marsh Posté le 02-06-2010 à 13:41:08    

Bonjour,  
 
Je veux insérer une image .png dans ma base de données dans un champ de type BLOB. d'abord je fais $fichier = file_get_contents("chemin image" ); puis $image = base64_encode($fichier); et j'insère dans la BD le $image et quand je lance ce code :  
$req =  mysql_query("SELECT * FROM testimage WHERE id=1" ) or die(mysql_error());
  $rep = mysql_fetch_array($req);
  $image = $rep['image'];
  $image;
  $data = base64_decode($image);
  $im = imagecreatefromstring($data);
  if ($im !== false) {
   header('Content-Type: image/png');
   imagepng($im);
   imagedestroy($im);
  }
  else {
   echo 'An error occurred.';
  }

il m'affiche le message d'erreur suivante : l'image ne peut pas être afficher car elle contient des erreurs.  
 
par contre quand je lance ce code ça marche parfaitement (sans insertion dans la base de données) . dans $data j'ai mis directement le  
$data = base64_encode($fichier);
$data = 'iVBORw0KGgoAAAANSUhEUgAAABwAAAASCAMAAAB/2U7WAAAABl'
       . 'BMVEUAAAD///+l2Z/dAAAASUlEQVR4XqWQUQoAIAxC2/0vXZDr'
       . 'EX4IJTRkb7lobNUStXsB0jIXIAMSsQnWlsV+wULF4Avk9fLq2r'
       . '8a5HSE35Q3eO2XP1A1wQkZSgETvDtKdQAAAABJRU5ErkJggg==';
$data = base64_decode($data);
$im = imagecreatefromstring($data);
if ($im !== false) {
    header('Content-Type: image/png');
    imagepng($im);
    imagedestroy($im);
}
else {
    echo 'An error occurred.';
}

 
je ne vois pas où est le problème . Merci pour votre aide

Reply

Marsh Posté le 02-06-2010 à 13:41:08   

Reply

Marsh Posté le 02-06-2010 à 17:10:01    

as-tu un texte envoyé au navigateur avant  tes headers ? genre un espace ou un retour chariot avant <?php ou après ?> ...


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 02-06-2010 à 19:41:56    

attention à la ligne en rouge :

Code :
  1. $req =  mysql_query("SELECT * FROM testimage WHERE id=1" ) or die(mysql_error());
  2.   $rep = mysql_fetch_array($req);
  3.   $image = $rep['image'];
  4.   $image;
  5.   $data = base64_decode($image);
  6.   $im = imagecreatefromstring($data);
  7.   if ($im !== false) {
  8.    header('Content-Type: image/png');
  9.    imagepng($im);
  10.    imagedestroy($im);
  11.   }
  12.   else {
  13.    echo 'An error occurred.';
  14.   }


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 03-06-2010 à 10:01:09    

stef_dobermann a écrit :

attention à la ligne en rouge :

Code :
  1. $req =  mysql_query("SELECT * FROM testimage WHERE id=1" ) or die(mysql_error());
  2.   $rep = mysql_fetch_array($req);
  3.   $image = $rep['image'];
  4.   $image;
  5.   $data = base64_decode($image);
  6.   $im = imagecreatefromstring($data);
  7.   if ($im !== false) {
  8.    header('Content-Type: image/png');
  9.    imagepng($im);
  10.    imagedestroy($im);
  11.   }
  12.   else {
  13.    echo 'An error occurred.';
  14.   }



 
Bonjour,  
Merci pour votre réponse; j'ai réussi à insérer dans la BD mais pour afficher je suis oblige de passer par un "href"  
<a href='afficherImage.php?id=$donneesVisu[id_data]' target='wclose' onclick=window.open('afficherImage.php?id=$donneesVisu[id_data]','_blank','width=400,height=300,,left=20,top=30')>$donneesVisu[nom_image]</a>
qui me dirige ver sune page afficherImage.php qui contient :  
Header("Content-type: image/png" );
// connection a la base de donnees
$db = mysql_connect("localhost", "utilisateur", "mot_de_passe" ) or die(mysql_error());
mysql_select_db("NOM_BASE" ) or die(mysql_error());  
 
$id = $_GET['id'];
 
$req =  mysql_query("SELECT * FROM data WHERE id_data=$id" ) or die(mysql_error());
while($rep = mysql_fetch_array($req))
{
  $image = $rep['data'];
  $data = base64_decode($image);
  $im = imagecreatefromstring($data);
  if ($im !== false) {
   imagepng($im);
   imagedestroy($im);
  }
  else {
   echo 'An error occurred.';
  }  
}

 
et quand je mis ce code (code d'affichage) dans un autre fichier php ça marche pas : c'est un pb de header ???

Reply

Marsh Posté le 03-06-2010 à 10:48:54    

Je ne sais pas d'où sort ce imagepng & co mais bon... voilà du code pour streamer correctement une ressource :
 

Code :
  1. /**
  2.      * Method used to send a logo to the browser.
  3.      *
  4.      * @param   string  $content
  5.      * @return  void
  6.      */
  7.     private function _sendLogo($content)
  8.     {
  9.         // Preparing HTTP response headers...
  10.         header('Pragma: public');
  11.         header('Content-Type: image/jpeg');
  12.         $etag = '"' . md5($content) . '"';
  13.         header('ETag: ' . $etag);
  14.         $expires = 2592000; // 1 month of cache validity.
  15.         header('Cache-Control: maxage=' . $expires);
  16.         header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires) . ' GMT');
  17.         // Checking if the cache of the client is up-to-date or not...
  18.         $requestHeaders = getallheaders();
  19.         if (array_key_exists('If-None-Match', $requestHeaders) && ($requestHeaders['If-None-Match'] === $etag)) {
  20.             header('HTTP/1.0 304 Not Modified');
  21.             flush();
  22.             exit;
  23.         }
  24.         // Stops output buffering...
  25.         ob_implicit_flush();
  26.         ob_end_flush();
  27.         // Sending HTTP response headers...
  28.         flush();
  29.         if ($content !== '') {
  30.             echo $content;
  31.         } else {
  32.             echo file_get_contents(APPLICATION_PATH . '/../public/images/blank_image.jpg');
  33.         }
  34.         flush();
  35.         exit;
  36.     }


 
Il faut bien sur aucun autre echo/print avant l'appel à cette fonction, et que $content soit le contenu binaire du fichier.
 
D'ailleurs tu peux ne pas faire de base64encode/decode, les BLOB ça supportent sans soucis les données binaires. ;)


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 03-06-2010 à 10:50:12    

donc tu as raison, c'est bien un problème header, il doit y avoir un caractère ou un commentaire qui est envoyé avant ce qui pose problème.


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 03-06-2010 à 13:01:50    

Merci bcp  
comme ça je reste avec une fichier spécifique pour l'affichage de l'image
 
merci pour la fonction, je vous dis la réponse quand je la teste
A+


Message édité par atout1 le 03-06-2010 à 13:04:12
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed