php - subir - Mostrar una imagen almacenada como blob en SQL Server
mostrar imagenes guardadas en base de datos php (1)
Tengo una consulta para buscar imágenes de información:
$q4 = "SELECT TOP 3 b.BadgeName, b.BadgeImage FROM BadgeImageTable AS b
INNER JOIN employee_badge AS e
ON e.badge_id = b.BadgeID
WHERE e.employee_id = 2164
ORDER BY e.earned_on DESC ";
$stmt3=sqlsrv_query($conn,$q4);
if($stmt3==false){
echo ''error to retrieve info !! <br/>'';
die(print_r(sqlsrv_errors(),TRUE));
}
HTML anterior:
<!--
<span class="fa-stack fa-5x has-badge" >
<div class="badgesize">
<img src="images/1.png" alt="" >
</div>
</span>
-->
Ahora, en el HTML anterior, intento hacer eco de las imágenes:
<span class="fa-stack fa-5x has-badge" >
<div class="badgesize">
<img src="
<?php
if($count = sqlsrv_num_rows($stmt3) > 0){
while($recentBadge = sqlsrv_fetch_array($stmt3, SQLSRV_FETCH_ASSOC)){
$result[] = $recentBadge;
}
if($count > 3){
$result = array_rand($result, 3);
}
foreach($result as $recentBadge){
echo
$recentBadge[''BadgeName''],
''<img src="data:image/png;base64,''.base64_encode($recentBadge[''BadgeImage'']).''"/>'',
''<br>''
;
}
} else {
echo ''no results'';
}
?>
" alt="" >
</div>
</span>
</div>
</span>
BadgeImage, BadgeID y BadgeName son nombres de columna en "BadgeImageTable" desde donde trato de hacer eco.
cuando uso la consulta en mi DB, obtengo los datos como lo desee. PLz, mira a continuación.
Problema: no puedo hacer eco de la BadgeImage anterior en el html.
Almacena la imagen con la siguiente consulta:
Insert Into BadgeImageTable(BadgeID, BadgeImage)
Select ''77'', BulkColumn
from Openrowset (Bulk ''C:/Users/mrashidjne/Desktop/diligent.png'', Single_Blob) as Image
actualmente esto es lo que veo cuando trato de hacer eco de la imagen:
Lo único que pude encontrar sobre este tema es que debes buscar la imagen como binario:
while(sqlsrv_fetch($stmt3)){
$result[] = [
''name'' => sqlsrv_get_field($stmt3, 0),
''img'' => sqlsrv_get_field($stmt3, 1, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY))
];
}
Con esto, deberías poder mostrar la imagen:
function blob2image($mime, $blob){
ob_start();
header("Content-type:$mime");
echo $blob;
return ob_get_contents();
}
$mime = ''image/png'';
foreach($result as $row){
echo $row[''name''];
echo ''<img src="data:''.$mime.'';base64,''.base64_encode(blob2image($mime, $row[''img''])).''"/>'';
}
No puedo decir con certeza que esto funcione porque no tengo la capacidad de probar y tampoco pude encontrar mucha información sobre este tema.
Una forma alternativa es almacenar la imagen como:
- Texto codificado en Base64
- Almacenar el camino de la imagen
Cualquiera de los métodos requiere cambiar el tipo de datos de columna de BadgeImage
a text
para imágenes codificadas o varchar
si desea almacenar la ruta.
$file = ''C:/Users/mrashidjne/Desktop/diligent.png'';
#$file = ''images/1.png''; // or store path relative to webroot and echo image as normally.
$mime = mime_content_type($fn);
$img = base64_encode(file_get_contents($fn));
$src = "$data:$mime;base64,$img"
$sql = "INSERT INTO BadgeImageTable (BadgeName, BadgeImage) VALUES (''diligent'', ''$src'')";
Ahora, al imprimir, debería ser tan fácil como:
echo ''<img src="''.$row[''BadgeImage''].''"/>'';