在SQL Server中显示存储为blob的图像

时间:2016-12-13 04:55:10

标签: php html sql-server sql-server-2005 sql-server-2012

我有一个查询来获取信息图片:

$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 previous:

<!-- 
<span class="fa-stack fa-5x has-badge" >
  <div class="badgesize">
    <img src="images/1.png"  alt=""   >
  </div>
</span> 
-->

现在在上面的HTML中我试图回显图像:

<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和BadgeName是我试图回应的“BadgeImageTable”中的列名。

当我在我的数据库中使用查询时,它根据需要获取数据。 PLz,见下文。 https://pypi.python.org/pypi/pathlib/

问题:我无法回复html中的上述BadgeImage。

我使用以下查询存储了图片:

Insert Into BadgeImageTable(BadgeID, BadgeImage)
Select '77', BulkColumn 
from Openrowset (Bulk 'C:\Users\mrashidjne\Desktop\diligent.png', Single_Blob) as Image

目前这是我在尝试回显图像时看到的内容: enter image description here

1 个答案:

答案 0 :(得分:1)

我唯一能找到的关于这个问题的是你应该把图像作为二进制文件获取:

while(sqlsrv_fetch($stmt3)){
  $result[] = [
    'name' => sqlsrv_get_field($stmt3, 0),
    'img'  => sqlsrv_get_field($stmt3, 1, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY))
  ];
}

有了这个,您应该能够显示图像:

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'])).'"/>';
}

我无法肯定地说这是有效的,因为我没有能力进行测试,而且我也找不到关于这个主题的更多信息。

另一种方法是将图像存储为:

  1. Base64编码文字
  2. 存储图像的路径
  3. 如果您要存储路径,则任何一种方法都需要将BadgeImage的列数据类型更改为textvarchar

    $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')";
    

    现在在打印时,它应该像以下一样简单:

    echo '<img src="'.$row['BadgeImage'].'"/>';