帮助从 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中将图像上传到 SQL Server

从 Access 数据库到 SQL Server 的图像

如何在 ms 访问中显示来自 sql server 的图像

“System.OutOfMemoryException: 'Out of memory.'” 从 SQL Server 读取图像时

从excel读取图像并将其存储在sql server中

如何使用 web api 将图像和文本从 android 应用程序发送到 sql server