小编典典

帮助从SQL Server读取二进制图像数据到PHP

sql

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

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

插入到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['picture'];

function hex2bin($h)
  {
  if (!is_string($h)) return null;
  $r='';
  for ($a=0; $a<strlen($h); $a+=2) { $r.=chr(hexdec($h{$a}.$h{($a+1)})); }
  return $r;
  }

$image = hex2bin($image);

header("Content-type: image/gif");

print $image;

exit; 
?>

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


阅读 240

收藏
2021-04-28

共1个答案

小编典典

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

  1. 转义二进制数据,使其可以在SQL查询中使用。您可以通过在插入数据之前使用addslashes()以及在数据返回时使用stripslashes()来实现。

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

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

 select hex(image) from table;

您可以在SQL中像X‘1234ABCD’这样将二进制数据写为十六进制。

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

2021-04-28