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

时间:2010-04-13 15:12:02

标签: php sql sql-server image binary-data

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

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

  

INSERT INTO myTable(文档)   SELECT * FROM   OPENROWSET(BULK N'C:\ image.jpg',SINGLE_BLOB)为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; 
?>

这是我必须显示图像的方式。谢谢你提到了十六进制提示,这让我能够找出问题所在。

1 个答案:

答案 0 :(得分:2)

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

  1. 转义二进制数据,使其在SQL查询中有效。您可以在插入数据之前使用addslashes()并在返回数据时使用stripslashes()来完成此操作。

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

  3. 不确定它是否是标准SQL,但在MySQL中,你可以像这样读取BLOB到十六进制,

     select hex(image) from table;
    

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

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