【问题标题】:Save a PDF created with FPDF php library in a MySQL blob field将使用 FPDF php 库创建的 PDF 保存在 MySQL blob 字段中
【发布时间】:2010-11-21 09:03:40
【问题描述】:

我需要使用 fpdf 库创建一个 pdf 文件,并将其保存在我的 MySQL 数据库中的 blob 字段中。 问题是,当我尝试从 blob 字段中检索文件并将其发送到浏览器进行下载时,下载的文件已损坏并且无法正确显示。

如果我立即将其发送到浏览器而不将其存储在数据库中,则可以正确显示相同的 pdf 文件,因此当插入数据库时​​,某些数据似乎已损坏。

我的代码是这样的:

$pdf = new MyPDF(); //class that extends FPDF and create te pdf file
$content = $pdf->Output("", "S"); //return the pdf file content as string
$sql = "insert into mytable(myblobfield) values('".addslashes($content)."')";
mysql_query($sql);

存储pdf,像这样:

$sql = "select myblobfield from mytable where id = '1'";
$result = mysql_query($sql);
$rs = mysql_fetch_assoc($result);
$content = stripslashes($rs['myblobfield']);
header('Content-Type: application/pdf');
header("Content-Length: ".strlen(content));
header('Content-Disposition: attachment; filename=myfile.pdf');
print $content;

将其发送到浏览器进行下载。 我做错了什么?

如果我将代码更改为:

$pdf = new MyPDF(); 
$pdf->Output(); //send the pdf to the browser

该文件已正确显示,因此我认为该文件已正确生成并且问题出在数据库中的存储中。

提前致谢。

【问题讨论】:

    标签: php pdf fpdf


    【解决方案1】:

    我最近正在处理这个问题,重要的是在我们给出的测试解决方案之后给出答案。然后,我解决了这个问题如下。 为了保存生成的 fpdf,我使用了这个代码..

    $content = $pdf->Output("", "S"); 
    // addslashes is the key to store blob file
    $data = addslashes($content); 
    $name = "testname.pdf";
    $mime = "application/pdf";
    $extficheiro = "pdf";
    $nomeficheiro = "miarchivo";
    $size = strlen($content);
    $query = "INSERT INTO filetable(name, mime, size, data, created)
        VALUES ('$name','$mime', '$size', '$data', NOW())";                      
    $conn->query($query);
    

    从我的数据库中读取(从数据库中检索)比我使用 pdo 代码更可取:

    if(filter_has_var(INPUT_GET, "var") !== false && filter_input(INPUT_GET, 'var', FILTER_VALIDATE_INT) !== false)
    {
        $var = filter_input(INPUT_GET, "var", FILTER_SANITIZE_NUMBER_INT);
        try     {
            $dbh = new PDO("mysql:host=our_host;dbname=database", 'username', 'password');
            $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
            $sql = "SELECT * FROM filetable  WHERE id= ".$var;
    
            $stmt = $dbh->prepare($sql);
            $stmt->execute(); 
            $stmt->setFetchMode(PDO::FETCH_ASSOC);
            $array = $stmt->fetch();
    
            /*** set the headers and display the file ***/
            header("Content-Type: ". $array['mime']);
            header("Content-Length: ". $array['size']);/**/
            header("Content-Disposition: inline; filename='". ($array['name'])."'");
            echo $array['data'];
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }
        catch(Exception $e)
        {
            echo $e->getMessage();
        }
    }
    else
    {
        echo '0'; // out of bounds
    }
    

    这些代码运行良好。我希望这个贡献可以帮助其他人解决这个问题。最好的问候。

    【讨论】:

    • 包括“../../connect/connect.php”; $var = $_GET['var']; $sql = "SELECT * FROM ficheirosprop WHERE idfich=".$var; $res = $conn->查询($sql); $row = $res->fetch_assoc(); /*** 设置标题并显示文件 ***/ header("Content-Type: ".$row['mime']); header("内容长度:"。$row['size']); header("Content-Disposition: inline; filename='". ($row['name'])."'");回声 $row['data']; $conn->close();
    【解决方案2】:

    解决了!

    我也遇到了同样的问题,正在尝试上述想法。解决这个问题的原因是我的 MySQL 数据库将 PDF 存储为 blob 而不是 mediumblob。一个 blob 字段被限制为 64K,从而截断了我的 PDF 的其余部分,其中包括有价值的数据,包括 EOF(因此是讨厌的 Adob​​e 错误)。

    要确认,请下载它提供的 PDF 文件并查看文件大小。如果正好是 64K,则需要通过将字段设置为 mediumblob 在 DB 中腾出更多空间。

    感谢大家的帮助!

    顺便说一句,我听从了托托的建议,改用了mysql_real_escape_string(),以及:

    1. 删除stripslashes()
    2. addslashes() 替换为mysql_real_escape_string()

    通过对原始海报代码的这些更改,它起作用了!

    【讨论】:

      【解决方案3】:

      更换

      header("Content-Length: ".strlen(content)); 
      

      header("Content-Length: ".strlen($content)); 
      

      为我工作。

      【讨论】:

        【解决方案4】:

        其实是出于安全原因:

        1. 不要使用addslashes(),而是使用mysql_real_escape_string()

        在这种特定情况下(因为它是二进制数据):

        1. 删除stripslashes()
        2. addslashes() 替换为mysql_real_escape_string()

        【讨论】:

          【解决方案5】:

          比较字符串中的差异以帮助调试问题。

          $pdf = new MyPDF();
          echo $pdf->Output("", "S"); //send the pdf string to the browser
          exit;
          

          $pdf = new MyPDF(); //class that extends FPDF and create te pdf file
          $content = $pdf->Output("", "S"); //return the pdf file content as string
          $sql = "insert into mytable(myblobfield) values('".addslashes($content)."')";
          mysql_query($sql);
          $sql = "select myblobfield from mytable where id = '1'";
          $result = mysql_query($sql);
          $rs = mysql_fetch_assoc($result);
          $content = stripslashes($rs['myblobfield']);
          echo $content; //send the pdf string to the browser
          exit;
          

          【讨论】:

            【解决方案6】:

            您不应该删除任何(反)斜杠。添加它们时,它们在查询中用作转义字符,不会出现在字段中。

            尝试更改此设置

            $content = stripslashes($rs['myblobfield']);
            

            进入这个:

            $content = $rs['myblobfield'];
            

            【讨论】:

            • 您好,我对这个话题很感兴趣。那么您如何将它保存在文件系统中呢?我需要通过电子邮件发送 pdf。谢谢
            猜你喜欢
            • 1970-01-01
            • 2020-07-20
            • 2017-08-21
            • 2015-04-23
            • 2015-02-05
            • 2014-07-06
            • 2016-12-31
            • 1970-01-01
            • 2011-04-01
            相关资源
            最近更新 更多