php - 如何读取保存在mysql数据库中的pdf文件?

标签 php mysql pdf

我已成功将 pdf 文件上传到数据库,但现在当我尝试读取文件时,单击链接时出现“无法加载 PDF”问题。我检查了我的浏览器插件没有问题。

<?php
$con=mysqli_connect("localhost","root","");
// Check connection
if (mysqli_connect_errno())
{
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
mysqli_select_db($con,"mahmood_faridi");

$query = "SELECT id, name FROM upload";
$result = mysqli_query($con,$query) or die('Error, query failed');

if(mysqli_num_rows($result)==0){
    echo "Database is empty <br>";
}
else{
    while(list($id, $name) = mysqli_fetch_array($result)){
        echo "<a href=\"download.php?id=\$id\">$name</a><br>";
    }
}

if(isset($_GET['id'])){
    $id    = $_GET['id'];   
    $query = "SELECT  content FROM upload WHERE id = '$id'";       
    $result = mysqli_query($con,$query) or die('Error, query failed');
    $row =  mysqli_fetch_row($result);
    $content=$row['content'];   
    header('Content-type: application/pdf');
    header('Content-Disposition: inline; filename="' . $content . '"');
    header('Content-Transfer-Encoding: binary');
    header('Accept-Ranges: bytes');
    ob_clean();
    ob_flush ();
    @readfile($content);
}
mysqli_close($con);
?>

这是“保存文件”代码:

<?php
$con=mysqli_connect("localhost","root","");
// Check connection
if (mysqli_connect_errno())
{
   echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0)
{
    $fileName = $_FILES['userfile']['name'];
    $tmpName  = $_FILES['userfile']['tmp_name'];
    $fileSize = $_FILES['userfile']['size'];
    $fileType = $_FILES['userfile']['type'];

    $fp      = fopen($tmpName, 'r');
    $content = fread($fp, filesize($tmpName));
    $content = mysqli_real_escape_string($con,$content);
    fclose($fp);

    if(!get_magic_quotes_gpc())
    {
        $fileName = mysqli_real_escape_string($con,$fileName);
    }

    mysqli_select_db($con,"mahmood_faridi");
    $query = "INSERT INTO upload (name, size, type, content ) ".
    "VALUES ('$fileName', '$fileSize', '$fileType', '$content')";

    mysqli_query($con,$query) or die('Error, query failed'); 
    mysqli_close($con);
    echo "<br>File $fileName uploaded<br>";
} 
else
    echo "File not uploaded"
?>

最佳答案

我本来打算将此作为评论发布,但它有点太长了。

将文件保存到数据库时,尝试对内容进行base64_encoding,然后在读取时对内容进行base64_decoding。以文本形式查看 PDF 时看起来很奇怪,并且数据库的排序规则会影响其保存方式,甚至会影响保存的内容。如果一个字符发生变化,您的 PDF 就会损坏。

还要确保错误报告已关闭,并且 PDF 旁边没有输出空格,这也会显示为文件已损坏。

我还会考虑将您拥有的功能拆分到不同的文件中。看起来所有内容都在一个文件中,这可能会导致在您不完全期望时发生输出,再次损坏下载。

作为替代方案,您可以不将 PDF 保存到磁盘并将位置存储在数据库中吗?然后您可以根据需要读取文件并将其输出,这样就不会出现数据库中的 PDF 内容被损坏的问题。如果您采用此方法,请确保为它们指定唯一的名称,因为可能会使用相同的名称上传两个文件,并且您可能会意外覆盖其中一个。

关于php - 如何读取保存在mysql数据库中的pdf文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35189545/

相关文章:

php - 在 PHP 中扩展类

javascript - 如何在没有数据时隐藏选择选项

mysql - 在MySql函数中使用动态SQL

mysql - 指数优化

php - 检查已进入数据库但未进入文件夹的文件

pdf - 如何在创建 pdf 时使用呈现的模板

php - 我如何通过跨域用户 session 加强这种安全性?

PHP 文件下载问题 - 无法读取

javascript - 使用 Shrimp AngularJS 将 View 转为 pdf

PHP PDF 生成器建议