帮助从 SQL Server 读取二进制图像数据到 PHP
Posted
技术标签:
【中文标题】帮助从 SQL Server 读取二进制图像数据到 PHP【英文标题】:Help Reading Binary Image Data from SQL Server into PHP 【发布时间】:2010-04-13 15:12:02 【问题描述】:我似乎无法找到将二进制数据从 SQL Server 读取到 php 中的方法。我正在做一个项目,我需要能够将图像直接存储在 SQL 表中,而不是文件系统中。
目前,我一直在使用这样的查询:
插入我的表格(文档) 选择 * 从 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['图片']; 函数 hex2bin($h) if (!is_string($h)) 返回空值; $r=''; for ($a=0; $a这就是我必须显示图像的方式。感谢您提到十六进制提示,这让我能够找出问题所在。
【问题讨论】:
你试过用chrome查看无效图片的来源吗?可能有一个 PHP 错误被转储,导致图像无效,或者可以解释为什么甚至没有图像数据被转储。我记得曾经有一种方法可以在 Firefox 中执行此操作,但它现在似乎对我有用的唯一浏览器是 chrome。 我尝试过使用 SQL Server Management Studio 并将二进制数据直接保存到我的文件系统中,即使这样也不会显示图像。当我查看表格时,数据以“0xFFD8FFE0 ...”之类的格式存储,而不是一堆垃圾字符。 我可以访问工作中的两台服务器。其中一个我的权限设置非常低,不允许我使用批量插入,这使得测试我遇到的图像问题变得非常困难。最近给我的另一个是专门尝试找出一种显示图像的方法,我目前安装了 SQL 服务器,并且 Apache 和 PHP 工作。在给定的这个测试服务器上,我还无法配置我的 php.ini 文件以与 SQL Server 一起使用。一旦我让 SQL Server 与 PHP 一起工作,我就可以做更多的测试。 你能粘贴你用过的PHP代码吗?我有很多怀疑,不知道该评论哪一个,可能一个都没有。 【参考方案1】:没有使用过 SQLServer 的经验,但我确实使用过 mysql 中的 BLOB。你有两个选择,
转义二进制数据,使其在 SQL 查询中工作。您可以在插入数据之前使用addslashes(),在数据返回时使用stripslashes()。
使用 SQL 查询的十六进制语法。
不确定它是否是标准 SQL,但在 MySQL 中,您可以像这样将 BLOB 读入十六进制,
select hex(image) from table;
您可以在 SQL 中将二进制数据写入为十六进制,例如 X'1234ABCD'。
PHP 提供 hex2bin/bin2hex 让你可以轻松转换。
【讨论】:
哦,所以当我拉入数据时,找到一个PHP函数将十六进制转换为二进制然后尝试显示图像?我在想也许它已经是十六进制形式了,这可能是它不起作用的原因。在我完成让 SQL Server 通过我的 Apache PHP 设置工作后,我会立即尝试类似的操作。 查看我的编辑。如果它已经是十六进制形式,您只需要使用 hex2bin() 转换为二进制即可。【参考方案2】: $qry=" **Your Query statement**";
echo"<table cellspacing='10px' cellpadding='15px'>";
$i=1;
$res=mssql_query($qry)or die(mssql_get_last_message());
//echo $qry;
while($rw2=mssql_fetch_assoc($res))
$code_base64 =base64_encode($rw2['**Binary Table Field Name**']);
$code_json =json_encode($code_base64);
//Multiple Image Display in array format
<img src="" id="Grnimage<?php echo $i;?>" name="grnimage[]" /></br></br>
<script type="text/javascript">
var id="Grnimage"+<?php echo $i;?>;
var tyype="image/png";
var jsonval=JSON.stringify(<?php echo $code_json; ?>);
var byteData= JSON.parse(jsonval);
var raw = window.atob(unescape(encodeURIComponent(byteData)));
var rawLength = raw.length;
var array = new Uint8Array(new ArrayBuffer(rawLength));
for(i = 0; i < rawLength; i++)
array[i] = raw.charCodeAt(i);
var blob = new Blob([array], type: tyype);
blobURL = window.URL.createObjectURL(blob);
document.getElementById(id).src = blobURL;
</script>
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。以上是关于帮助从 SQL Server 读取二进制图像数据到 PHP的主要内容,如果未能解决你的问题,请参考以下文章
“System.OutOfMemoryException: 'Out of memory.'” 从 SQL Server 读取图像时