我似乎无法想出一种从SQL服务器读取二进制数据到PHP的方法。我正在开发一个项目,我需要能够将图像直接存储在SQL表中,而不是存储在文件系统中。
目前,我一直在使用像这样的查询:
INSERT INTO myTable(文档) SELECT * FROM OPENROWSET(BULK N'C:\ image.jpg',SINGLE_BLOB)为BLAH
这可以很好地将图像插入到表格中,但我还没有找到一种方法来检索它并恢复我的图像。
我正在使用PHP进行此操作,最终将不得不从中创建存储过程,但任何人都可以通过某种方式启发我获取二进制数据(varbinary(MAX)
)并动态生成图像
我希望使用SELECT
语句很简单,并在标题中添加内容类型,表明它是一个图像,但它根本不起作用。相反,页面将只显示我过去遇到的文件名,并将其理解为图像数据的错误。
$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; ?>
这是我必须显示图像的方式。谢谢你提到了十六进制提示,这让我能够找出问题所在。
答案 0 :(得分:2)
没有使用SQLServer的经验,但我确实使用过MySQL中的BLOB。你有两个选择,
转义二进制数据,使其在SQL查询中有效。您可以在插入数据之前使用addslashes()并在返回数据时使用stripslashes()来完成此操作。
使用SQL查询的十六进制语法。
不确定它是否是标准SQL,但在MySQL中,你可以像这样读取BLOB到十六进制,
select hex(image) from table;
您可以在SQL中将二进制数据写为十六进制,如X'1234ABCD'。
PHP提供了hex2bin / bin2hex,因此您可以轻松转换。