我似乎无法找到将二进制数据从 SQL 服务器读取到 PHP 的方法。我正在开发一个项目,需要能够将图像直接存储在 SQL 表中,而不是文件系统上。
目前,我一直在使用这样的查询:
插入 myTable(文档)
选择*从
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;
?>
这就是我必须显示图像的方式。感谢您提到六角头,这使我能够找出问题所在。
没有使用 SQLServer 的经验,但我确实使用过 MySQL 中的 BLOB。你有两个选择,
转义二进制数据,以便它可以在 SQL 查询中工作。您可以通过在插入数据之前使用addslashes()并在数据返回时使用stripslashes()来完成此操作。
使用 SQL 查询的十六进制语法。
不确定它是否是标准 SQL,但在 MySQL 中,您可以像这样将 BLOB 读取为十六进制,
select hex(image) from table;
您可以在 SQL 中将二进制数据写入十六进制,例如 X'1234ABCD'。
PHP 提供了 hex2bin/bin2hex,因此您可以轻松转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)