【问题标题】:Saving pdf to BLOB (in mssql server) and output it back on website (php)将 pdf 保存到 BLOB(在 mssql 服务器中)并将其输出回网站(php)
【发布时间】:2016-02-11 08:57:29
【问题描述】:

我需要将 pdf 文件保存到 BLOB 中(数据库是 MsSql 2012,但我也需要它在 2008 上工作)。

这是我迄今为止尝试过的汇编:

(文件where I save pdf into database

function preparePDF2String($filepath)
{
    $handle = @fopen($filepath, 'rb');
    if ($handle)
    {
        $content = @fread($handle, filesize($filepath));
        $content = bin2hex($content);
        @fclose($handle);
        return "0x".$content;
    }
}

$out = preparePDF2String('pdf/pdf.pdf');
$q_blob = "INSERT INTO HISTORIA_ARCHIWUM_test(PDFName, PDFData) VALUES('First test pdf', $out) ";

$r_blob = mssql_query($q_blob,$polacz);

Results(好吧,我想)

(现在是php文件where I try to output the pdf

// header('Content-type: application/pdf');
// readfile('pdf/pdf.pdf'); - this works just fine, so pdf is ok


$q_blob = "select top 1 * from HISTORIA_ARCHIWUM_test";
$r_blob = mssql_query($q_blob,$polacz);
$w_blob = mssql_fetch_array($r_blob);

header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="the.pdf"');

echo $w_blob['PDFData'];
//echo hex2bin ($w_blob['PDFData']); - I also tried this - same problem

问题:当我尝试在浏览器中输出 pdf 时出现错误(此 pdf 格式不受支持)。它也不会在 Adob​​e 阅读器中打开。我的猜测是我输出错误,但也许是我保存它的方式?

【问题讨论】:

  • 为什么不将 PDF 保存在文件系统中的数据库之外,将其路径链接保存在数据库中并让 PHP 使用该链接(很像图像)?您避免将二进制内容转换为字符串。
  • 这是我的客户要求。他需要易于复制的大型 pdf 存储库(自动备份 - 一个大数据库文件)

标签: php sql-server pdf blob


【解决方案1】:

从 cmets 编辑
当您从 db 获取字符串时,似乎 php+mssql 会截断字符串,但在 php.ini 中可以对其进行管理。我设置了 mssql.textlimit = 160000 和 mssql.textsize = 160000,它适用于十六进制转换和 varchar(max)。


您在将 pdf 数据保存到数据库之前对其进行转换,您必须在输出之前撤消转换。

header('Content-type: application/pdf');
header('Content-Disposition: inline; filename="the.pdf"');

echo hex2bin(substr($w_blob['PDFData'], 2));

还有你为什么要首先转换数据,只需将其保存为二进制即可。

【讨论】:

  • 抱歉延迟回答(我无法访问 - 昨天这里是非工作日)。我确实尝试撤消转换,但没有成功 - 我尝试了几个 hex2binary 函数(包括来自 php.net 的函数)并且都看到有问题。奇怪,因为在数据库中似乎没问题。您建议不要进行转型可能是最好的方法,但我对此有疑问。如果我阅读 pdf 并尝试将其保存为二进制文件,我会得到:警告:mssql_query() [function.mssql-query]:消息:以 '.....' 开头的标识符太长。最大长度为 128。到目前为止,我无法处理这个问题。
  • PDFData 是什么类型的字段?尝试使用 VARBINARY(MAX)
  • 它是 VARBINARY(MAX) - 如果我转换为 HEX,何时考虑这可能是一个问题 :) (我假设 varbinary 仅表示二进制) - 我需要弄清楚如何使我的查询工作,无需转换。非常简单的测试: INSERT INTO HISTORIA_ARCHIWUM_test(PDFName, PDFData) VALUES('First test pdf', $out) where out is read pdf.
  • 您是否尝试过使用参数化查询来插入数据?
  • 试试select top 1 CONVERT(TEXT,PDFData) as PDFData * from HISTORIA_ARCHIWUM_test
猜你喜欢
  • 2013-10-09
  • 2017-03-19
  • 1970-01-01
  • 2018-08-30
  • 2015-05-26
  • 2011-01-18
  • 2016-01-28
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多