2

我似乎无法找到一种将二进制数据从 SQL 服务器读取到 PHP 中的方法。我正在做一个项目,我需要能够将图像直接存储在 SQL 表中,而不是文件系统上。

目前,我一直在使用这样的查询:

INSERT INTO myTable(Document) SELECT * FROM OPENROWSET(BULK N'C:\image.jpg', SINGLE_BLOB) as BLAH

这可以很好地将图像实际插入表中,但我还没有找到一种方法来检索它并取回我的图像。

我正在使用 PHP 执行此操作,最终将不得不用它创建一个存储过程,但是任何人都可以启发我获取二进制数据(varbinary(MAX))并动态生成图像的方法。

我希望使用SELECT语句并将内容类型添加到表明它是图像的标题中会很简单,但它根本不起作用。相反,该页面将仅显示文件的名称,这是我过去遇到的并理解为图像数据错误。

编辑:我想我想通了。从存储过程读取时,SQL Server 仅发送最多 8000 个字节,因此导致我正在测试的图像中断。

$q = "Get_Picture_Test_SP @pk_rms_id=1443546";
$res = mssql_query($q);

$row = mssql_fetch_assoc($res);

$image = $row['图片'];

函数 hex2bin($h)
  {
  if (!is_string($h)) 返回空值;
  $r='';
  for ($a=0; $a<strlen($h); $a+=2) { $r.=chr(hexdec($h{$a}.$h{($a+1)})); }
  返回 $r;
  }

$image = hex2bin($image);

header("内容类型:图片/gif");

打印$图像;

出口;
?>

这就是我必须显示图像的方式。感谢您提及十六进制提示,这使我能够找出问题所在。

4

2 回答 2

2

没有使用 SQLServer 的经验,但我确实在 MySQL 中使用过 BLOB。你有两个选择,

  1. 转义二进制数据,使其在 SQL 查询中工作。您可以在插入数据之前使用addslashes() 并在数据返回时使用stripslashes() 来做到这一点。

  2. 使用 SQL 查询的十六进制语法。

不确定它是否是标准 SQL 但在 MySQL 中,您可以像这样将 BLOB 读入十六进制,

 select hex(image) from table;

您可以在 SQL 中将二进制数据写入为十六进制,例如 X'1234ABCD'。

PHP 提供了 hex2bin/bin2hex,因此您可以轻松转换。

于 2010-04-13T16:19:48.580 回答
0
    $qry=" **Your Query statement**";
echo"<table cellspacing='10px' cellpadding='15px'>";
$i=1;
$res=mssql_query($qry)or die(mssql_get_last_message());
//echo $qry;
while($rw2=mssql_fetch_assoc($res))
    {
            $code_base64 =base64_encode($rw2['**Binary Table Field Name**']);
$code_json =json_encode($code_base64);
//Multiple Image Display in array format
<img src="" id="Grnimage<?php echo $i;?>" alt=" " name="grnimage[]" width="200" height="180" /></br></br>
        <script type="text/javascript">
        var id="Grnimage"+<?php echo $i;?>;
            var tyype="image/png";
        var jsonval=JSON.stringify(<?php echo  $code_json; ?>);
var byteData= JSON.parse(jsonval);
                var raw = window.atob(unescape(encodeURIComponent(byteData)));
    var rawLength = raw.length;
    var array = new Uint8Array(new ArrayBuffer(rawLength));
    for(i = 0; i < rawLength; i++) {
        array[i] = raw.charCodeAt(i);
    }
        var blob = new Blob([array], {type: tyype});
                blobURL = window.URL.createObjectURL(blob);
            document.getElementById(id).src = blobURL;

</script>
于 2021-12-29T06:59:14.620 回答