如何在 MySQL 数据库中插入 pdf 文件,然后在 php 中读取?

Posted

技术标签:

【中文标题】如何在 MySQL 数据库中插入 pdf 文件,然后在 php 中读取?【英文标题】:How to insert a pdf file in a MySQL database and then read it in php? 【发布时间】:2021-10-06 15:43:34 【问题描述】:

我有一个 php 代码,它允许我使用 SendGrid 通过电子邮件发送 pdf 文件,并将该文件作为 BLOB 插入 mysql 数据库中。

一切正常,但插入数据库的文件始终是 [BLOB - 20,0 kio] 文件,我不知道它是否正确插入以及如何从数据库中检索它...

感谢您的帮助

<?php

 
 $filename2 = 'test.pdf';

 $file_encoded = base64_encode(file_get_contents("C:/wamp64/www/final/API_label/PDF/$filename2"));
 $email->addAttachment($file_encoded, "application/pdf", "$filename2", "attachment");

 $sendgrid = new \SendGrid('SG.Ebi-CnMATfeehrmw89O5CuSNfPk');
 try 
     // $response = $sendgrid->send($email);
     // print $response->statusCode() . "\n";
     // print_r($response->headers());
     // print $response->body() . "\n";
  catch (Exception $e) 
     // echo 'Caught exception: ' .  $e->getMessage() . "\n";/
 

      //Insertion of the values in the database
      try 
         // Connect to db
         $db = new db('mysql:dbname=jotform; host=localhost', 'root', '');
         $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

         // Set SQL
         $sql = 'INSERT INTO DHL (submission_id, formID, identite, email, adresse, telephone, label, commercial_invoice) 
         VALUES (:submission_id, :formID, :NOM, :EMAIL, :ADRESSE, :TELEPHONE, :file_encoded, :COMMERCIAL_INVOICE)';

         // Prepare query
         $query = $db->prepare($sql);
         $query->bindParam(':file_encoded', $file_encoded, PDO::PARAM_LOB);

         // Execute query
         $query->execute(array(':submission_id' => $submission_id, ':formID' => $formID, ':NOM' => $NOM, ':EMAIL' => $EMAIL, ':ADRESSE' => $ADRESSE, ':TELEPHONE' => $TELEPHONE, 
         ':file_encoded' => $file_encoded, ':COMMERCIAL_INVOICE' => $COMMERCIAL_INVOICE));
      catch (PDOException $e) 
         echo 'Error: ' . $e->getMessage();
     
 



?>

要下载的代码:

    //PDO PART
include '../include/classe_PDO.php';

 try 
  // Connect to db
  $db = new db('mysql:dbname=jotform; host=localhost', 'root', '');
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // Set SQL
  $sql = "SELECT * FROM `dhl` WHERE `submission_id` = '5094071540419221255'";

  foreach  ($db->query($sql) as $row) 
    
          $filedata = $row['label']; //get base64 data from query result
          $decoded = base64_decode($filedata); //decode base64 to binary
          
          //set suitable HTTP response headers
          header('Content-Description: File Transfer'); 
          header('Content-Type: application/octet-stream'); 
          header('Content-Disposition: attachment; filename="label.pdf"');
          header('Expires: 0'); 
          header('Cache-Control: must-revalidate'); 
          header('Pragma: public'); 
          //output the binary file data in the body of the response
          echo $decoded; 
          exit;




 catch (PDOException $e) 
  echo 'Error: ' . $e->getMessage();
         


?>

【问题讨论】:

***.com/questions/32329586/… 可能会帮助你 很抱歉,但我不明白如何在链接中进行操作...@ADyson 为什么,你没有完全理解什么?你有没有尝试在你的代码中使用它?它展示了如何从表中获取 blob 数据以及如何将其作为下载提供给用户。 是的,我做到了,但问题是我的数据库中的文件是 base64 编码的,当我想对其进行解码下载时它不起作用...... 在下面添加了答案,以便您标记为已接受(如果您觉得慷慨,也可以投票!)。谢谢。 【参考方案1】:

你需要

    将数据存储在 MySQL 的 TEXT 列中,而不是 BLOB,因为 base64 字符串是文本,而不是二进制数据。

    从数据库中查询该字段以获取 base64 数据

    将base64数据解码得到原始二进制数据。

    发送该数据以供下载,为您的浏览器设置适当的标头以了解它是文件下载而不是网页。

从您的问题的更新来看,您现在似乎已经对 SQL 部分进行了排序,所以在这里我将展示一种更简单的方法来下载数据,而无需先将文件写入服务器磁盘(您'然后需要稍后清理)。

$filedata = $row['label']; //get base64 data from query result
$decoded = base64_decode($filedata); //decode base64 to binary

//set suitable HTTP response headers
header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="test.pdf"');
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
//output the binary file data in the body of the response
echo $decoded; 
exit;

【讨论】:

感谢您的回答和详细解释。只需像这样修改您的行header('Content-Disposition: attachment; filename="test.pdf"'); 抱歉,当我复制它时,我忘了再次修复它。现已修改。谢谢你:-) 最后一个问题,我在 SQL 中进行数据插入和检索的方式是否正确?不对SQL注入开放? 您正在为插入查询中的所有内容设置参数,所以是的,这是安全的。并且您没有使用来自用户输入的任何数据的选择查询,因此自动它是安全的......但是如果您更改为从任何输入或查询字符串或任何内容中读取,您将需要使用参数。我建议在所有代码中都使用 PDO,在库之间切换会让人感到困惑并增加出错的机会。如果您不确定自己的操作是否正确,请参阅 How can I prevent SQL injection in PHP? 作为快速参考 我要给出的唯一额外建议是:永远不要将您的 Web 应用程序配置为以 root 登录数据库。 Root 可以为所欲为,因此如果意外出现任何漏洞,它会使您的数据库对黑客敞开大门。而是专门为此应用创建一个单独的用户帐户,该帐户仅具有它实际需要才能正常工作的权限。在开发或测试期间甚至不要使用“root”作为快捷方式,因为您还需要测试您的帐户权限 - 否则当您上线时,您可能会遇到与用户帐户设置相关的意外错误。

以上是关于如何在 MySQL 数据库中插入 pdf 文件,然后在 php 中读取?的主要内容,如果未能解决你的问题,请参考以下文章

如何在PDF中插入另一个PDF文件的页面

如何在PDF文档内容中插入/添加图片文件

PDF如何插入文本,PDF插入文本的方法。

[PDF文件怎么编辑]如何在PDF文档中插入图片

在乳胶#2中插入pdf文件

如何在PDF中插入透明PNG?