我似乎无法找出一种将SQL Server中的二进制数据读取到PHP中的方法。我正在一个项目中,我需要能够将图像直接存储在SQL表中,而不是文件系统中。
目前,我一直在使用这样的查询:
插入到myTable(Document)中SELECT * FROM OPENROWSET(BULK N’C:\ image.jpg’,SINGLE_BLOB)as BLAH
实际将图像插入表中的效果很好,但是我还没有找到一种方法来检索它并取回我的图像。
我正在使用PHP进行此操作,最终将不得不使用它来制作存储过程,但是任何人都可以启发我获取二进制数据(varbinary(MAX))并动态生成映像的方法。
varbinary(MAX)
我希望使用一条SELECT语句并在标头中添加内容类型(表明它是图像)会很简单,但这根本无法正常工作。取而代之的是,该页面将仅显示文件的名称,这是我过去遇到的,并且将其理解为图像数据的错误。
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; ?>
这就是我必须显示图像的方式。感谢您提到六角头,这使我能够找出问题所在。
没有使用SQLServer的经验,但是我确实在MySQL中使用过BLOB。您有两种选择,
转义二进制数据,使其可以在SQL查询中使用。您可以通过在插入数据之前使用addslashes()以及在数据返回时使用stripslashes()来实现。
使用SQL查询的十六进制语法。
不确定这是否是标准SQL,但在MySQL中,您可以像这样将BLOB读为十六进制,
select hex(image) from table;
您可以在SQL中像X‘1234ABCD’这样将二进制数据写为十六进制。
PHP提供了hex2bin / bin2hex,因此您可以轻松进行转换。