【发布时间】:2011-06-16 09:09:24
【问题描述】:
如何从 PHP 将 .pdf 文件作为 BLOB 存储到 MySQL 中?
【问题讨论】:
如何从 PHP 将 .pdf 文件作为 BLOB 存储到 MySQL 中?
【问题讨论】:
编辑添加:以下代码已过时,在 PHP 7 中不起作用。有关详细信息,请参阅答案底部的注释。
假设一个整数 ID 和一个 blob DATA 列的表结构,并假设 MySQL 函数被用于与数据库接口,你可能会做这样的事情:
$result = mysql_query 'INSERT INTO table (
data
) VALUES (
\'' . mysql_real_escape_string (file_get_contents ('/path/to/the/file/to/store.pdf')) . '\'
);';
提醒一句,在数据库中存储 blob 通常不被认为是最好的主意,因为它会导致表膨胀并且有许多其他相关的问题。更好的方法是将文件移动到文件系统中可以检索到的某个位置,并将文件的路径存储在数据库中,而不是文件本身。
此外,不鼓励使用 mysql_* 函数调用,因为这些方法实际上已被弃用,并且并未真正使用高于 4.x 的 MySQL 版本构建。您应该改用 mysqli 或 PDO。
更新:mysql_* 函数在 PHP 5.x 中被弃用,在 PHP 7 中被完全移除!您现在别无选择切换到更现代的数据库抽象(MySQLI,PDO)。由于历史原因,我决定保留上面的原始答案,但实际上并没有使用它
以下是在程序模式下使用 mysqli 的方法:
$result = mysqli_query ($db, 'INSERT INTO table (
data
) VALUES (
\'' . mysqli_real_escape_string (file_get_contents ('/path/to/the/file/to/store.pdf'), $db) . '\'
);');
理想的方法是使用 MySQLI/PDO 准备好的语句。
【讨论】:
mysqli_query() 需要一个数据库连接并作为第一个参数。我从有人将其用作可能的副本的问答中掉了下来。应该更新它以提供正确的语法;这适用于不知道这一切如何运作的未来访客/新手。
mysqli_real_escape_string() 也需要一个数据库连接。一旦你完成了 Gordon,你能 ping 我吗?
mysqli_query 'INSERT也应该有括号,就像mysqli_query($con, 'INSERT... . '\');');一样
关于上面 Gordon M 的回答,mysqli_real_escape_string () 调用中的第一个和第二个参数应该换成较新的 php 版本,
根据:http://php.net/manual/en/mysqli.real-escape-string.php
【讨论】:
//Pour inserer :
$pdf = addslashes(file_get_contents($_FILES['inputname']['tmp_name']));
$filetype = addslashes($_FILES['inputname']['type']);//pour le test
$namepdf = addslashes($_FILES['inputname']['name']);
if (substr($filetype, 0, 11) == 'application'){
$mysqli->query("insert into tablepdf(pdf_nom,pdf)value('$namepdf','$pdf')");
}
//Pour afficher :
$row = $mysqli->query("SELECT * FROM tablepdf where id=(select max(id) from tablepdf)");
foreach($row as $result){
$file=$result['pdf'];
}
header('Content-type: application/pdf');
echo file_get_contents('data:application/pdf;base64,'.base64_encode($file));
【讨论】: