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

时间:2016-02-03 23:09:00

标签: 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"
?>

2 个答案:

答案 0 :(得分:0)

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

将文件保存到数据库时,请尝试对内容进行base64_encoding,然后在读取时对其进行base64_decoding。在文本中查看时,PDF看起来很奇怪,数据库的整理会影响它保存的方式,甚至会影响保存的内容。如果一个字符发生更改,则表示PDF格式已损坏。

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

我还考虑将您拥有的功能拆分为不同的文件。看起来一切都在那里的一个文件中,当你没有完全期待它时会导致输出,再次破坏下载。

作为替代方法,您是否可以将PDF保存到磁盘并将位置存储在数据库中。然后,您可以根据需要读取文件并输出,然后在数据库中没有PDF内容损坏的问题。如果沿着这条路线前进,请确保给它们指定唯一的名称,因为可以使用相同的名称上传两个文件,您可能会意外覆盖一个。

答案 1 :(得分:0)

Oooooops!

我们都集中在编码和数据库存储,但问题是另一个!

输出PDF时,您可以从数据库中获取内容,但是您可以通过以下方式将此内容发送给用户:

@readfile($content);

readfile($content)使用filepath $content输出文件的内容,但在$content中没有任何文件路径!

您只需在

中更改此行代码即可
echo $content;

并且您的脚本将有效。

(了解更多关于readfile