2009-11-19 2 views
1

J'ai un code php assez simple qui renvoie des données d'image binaire d'une base de données.Obtention d'en-têtes lors de la diffusion d'images via PHP à partir d'une base de données

ob_start(); 

$stmt = $db->prepare($sql); 
$stmt->execute(array($ImageID)); 
$stmt->bindColumn(1, $lob, PDO::PARAM_LOB); 
$stmt->fetch(PDO::FETCH_BOUND); 

ob_clean(); 
header("Content-Type: " . $content_type); 

fpassthru($lob); 

Appelons ce script get_image.php. J'appelle ce script d'un autre pour obtenir les données d'image et ensuite le traiter. Ainsi. Je reçois des erreurs des fonctions de traitement d'image disant que "les données ne sont pas dans un format reconnu". Après avoir regardé la réponse, il semble que ma variable $ src inclut les en-têtes ainsi que les données binaires. J'ai fait de la recherche mais je n'arrive pas à comprendre comment se débarrasser de la sortie de l'en-tête et travailler avec la chaîne binaire brute. Toute aide est appréciée. Pour être clair, si j'imprime la chaîne $ src, à la place des données binaires brutes, voici ce que je veux dire.

HTTP/1.1 200 OK 
Date: Thu, 19 Nov 2009 17:33:01 GMT 
Server: Apache/2.2.8 (Unix) ... 
X-Powered-By: PHP/5.2.11 
Connection: close 
Content-Type: image/jpeg 

/* Then all the binary data */ 
+0

Est-ce que votre navigateur vous montrer de l'image lorsque vous ouvrez http://example.com/get_image.php?ImageID=foo manuellement? – John

+0

Oui. L'image apparaît bien lorsque je frappe le script directement. – Marco

Répondre

1

Je ne suis pas expert en PHP, ce qui est probablement où la vraie solution est (obtenir que le corps de la réponse, sans en-tête) mais je ne sais que mon HTTP. À cette fin, les en-têtes et le corps d'une requête HTTP comme ci-dessus sont toujours délimités par deux <CR><LF>. Vous devriez être capable de prendre la réponse, et obtenir une sous-chaîne à partir de là. Exemple Code iDontKnowPhp:

$start = $src.positionOf('<CR><LF><CR><LF>') 
$stop = $src.lenght() 
$img = $src.sub($start, $stop) 
+0

Merci. C'était la solution facile et cela fonctionne bien. J'ai ajouté un chèque pour les en-têtes en premier. stripos ($ src, 'http') === 0 – Marco

1

Il ressemble à l'enveloppe de flux de PHP n'est pas l'en-tête de décapage. Au lieu de file_get_contents essayer CURL à la place:

<?php 

$ch = curl_init("http://www.example.com/myimagescript.php"); 

curl_setopt($ch, CURLOPT_HEADER, 0); // No headers 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // grab the content of the file 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 

$contents= curl_exec($ch); 
curl_close($ch); 


?> 
Questions connexes