几天来我一直在为我遇到的问题拔头发。
尝试读取在 SQL 数据库(不是 mysql)varbinary 字段中作为二进制 blob 数据存储的 PDF。
如果我使用 Navicat 这样的程序,并将原始 blob 数据直接保存为 PDF,则该文件可以正常工作。
当我尝试通过 PHP 从 mssql 查询读取数据并创建一个 PDF 文件时 -
$file = "file.pdf";
$data = $row['FileData'];
file_put_contents($file, $data);
它创建PDF,但是它已损坏并且无法打开。
我很难确切地知道数据存储在数据库中的格式。当我在 Navicat 中查看 BLOB 数据时,它会像这样呈现它:
%PDF-1.4
%Çì¢
5 0 obj
<</Length 6 0 R/Filter /FlateDecode>>
stream
xœÅY[o·F_÷Wð%èlðÞûX¸-8èCÐy-Éjt±´qÚüŒö÷#‡Crv¹Y§ÞÔ`qÈÃÃsùÎ…Ô“# ±ñglïW_çÄÍn•¦ÅwɃç›ÕÓÊ*þKíx{/þxAR‹‹ë•CZN'I8ŠßF8FcI'ܯ†ß/þ±b3jlx?â? ¶rÔÊ‚áÅÛ¼}3Ïm2£y¡·ÿO«WÐB
'ÉŽÖ‰û•Æ—Ï»é[¢¸$”•ViGÅ^<_®¿'Ù‘øçÊ‹oAûÍj£a'’¡ÙBÉÞ¿´q×ë$TÆqRúI<–3weÆúežwÕ
9q–a›¢W¯~¢«ÕHŒ^£l'Ìÿê7–‹H^–
很难向你展示数据库中的原始数据是什么样子的,因为我认为二进制数据无法正确查看,你所看到的只是对它真实情况的解释。
任何帮助将不胜感激。谢谢。
通过将以下内容添加到我的 .htaccess 文件解决了这个问题
php_value mssql.textlimit 10000000
php_value mssql.textsize 10000000
基本上它正在写入文件,但它停止了 63kb(64,512 字节)到文件中,因此增加此限制使脚本能够完成文件的其余部分的写入。
希望这对其他人有同样的问题有帮助。
你试过这个吗?
select hex(pdf) from table;
使用上述查询并使用file_put_contents();
将内容存储到文件中。
PHP 在提供 binary to hex
和 hex to binary
之间的轻松转换方面做得很好。