2016-12-23 1 views
0

J'ai creusé mon cerveau en essayant de comprendre pourquoi une image ne s'affiche pas en utilisant Php PDO avec elle stockée dans Sql Server 2016 comme un champ Varbinary Max. J'utilise Php 7, et je travaille sur Php 5 en utilisant le même code, mais avec MySql. Je veux passer à Sql Server à la place. Lorsque je l'affiche, tout ce que je reçois est une image brisée, mais dans le code source, elle montre les données d'image. Il est codé en utilisant base64, et j'utilise une boucle while pour récupérer les enregistrements. Mon code est ci-dessous.Impossible d'afficher l'image à partir de SQL Server en utilisant PHP PDO utilisant Varbinary Max

L'insertion qui fonctionne bien et je peux voir l'image dans la base de données.

$sql1 = "INSERT INTO weather_stories (filedate, text, imgfile) 
       VALUES (:filedate, :text, :imgfile)"; 
    $preparedStatement = $conn->prepare($sql1); 
    $preparedStatement->bindParam(':filedate', $_POST['filedate']); 
    $preparedStatement->bindParam(':text', $_POST['text']); 
    $preparedStatement->bindParam(':imgfile', $output, PDO::PARAM_LOB, 0, PDO::SQLSRV_ENCODING_BINARY); 
    $preparedStatement->execute(); 

l'image Affichage:

$sql = "SELECT TOP (2) id, filedate, imgfile, text, adddatetime, CONCAT(ROUND(DATALENGTH(imgfile)/1024, 1), 'k') as size 
      FROM weather_stories 
      ORDER BY adddatetime DESC"; 
    // use exec() because no results are returned 
    $preparedStatement = $conn->prepare($sql); 

    $preparedStatement->execute(); 

    //retrieve records 
    while ($row = $preparedStatement->fetch()) { 

     //create table 
     echo "<tr>"; 
     echo "<td>" . $row['filedate'] . "</td>"; 
     echo "<td>" . $row['text'] . "</td>"; 
     echo "<td>" . $row['adddatetime'] . "</td>"; 
     echo "<td>" . $row['size'] . "</td>"; 
     echo "</tr>"; 
     echo "<tr>"; 
     echo "<td><a href='viewws.php?id=" . $row['id'] . "'>"; 
     echo "<img width='300' height='300' src='data:image/png;base64," . base64_encode($row['imgfile']) . "' />"; 

     echo "</a></td>"; 
     echo "<td><a href='#' id=" . $row['id'] . " class='deletews'>Delete</a></td>"; 
     echo "</tr>"; 
    } 

Je ne comprends pas pourquoi ce travail ne marche pas dans une balise img. Tout ce qu'il affiche est l'icône de l'image brisée, mais quand vous regardez le code source de la page, il montre les données après les données: tag dans l'image.

J'ai cherché partout une solution à ceci même ici et rien ne fonctionne. Je le soupçonne peut-être avec le fetch mais je ne sais pas pourquoi, car il y a une documentation limitée sur le web à ce sujet.

L'aide serait appréciée. Merci!

+0

L'étape 1 consiste à sélectionner un enregistrement unique et à sortir les données d'image binaire directement sur la page pour voir si c'est une image valide. Utilisez un appel approprié à 'header()' pour définir le type de contenu. – miken32

+0

Aussi utile de savoir: https://msdn.microsoft.com/en-us/library/bb522494.aspx – miken32

Répondre

0

j'ai tout compris simplement en jouant avec quelques idées Ive a trouvé,

echo '<img src="data:image/png;base64,' . base64_encode(hex2bin($row['imgfile'])) . '" >'; 

L'image devait être HEX2BIN 1er puis codé en base64 et il affiche maintenant correctement l'image. Je pensais que j'avais déjà essayé ça et ça ne marchait pas, à moins que j'aie manqué quelque chose, mais j'aurais aimé qu'il y ait un moyen plus simple.

Aussi la méthode header() ne fonctionne pas il donne un écran noir et l'image ne peut pas être affichée cause d'erreurs sur firefox. J'ai essayé cela avant et même problème. Je n'ai aucune idée de pourquoi cela fonctionne sur certains et pas ici.