在调用文件时不下载PDF

时间:2015-10-12 19:09:51

标签: php mysql pdf

我有一个数据库存储我网站的所有pdf文件。该表包含library_item_id,filename(文件名),mime_type,文件大小,file_item(Blob)的列,我有一个名为download.php的php文件。该文件应该在用户单击链接时从数据库中下载正确的文件。但是当文件被下载并点击打开时我得到Adobe说它无法打开pdf。说它没有正确解码。这是我的download.php文件:

require_once("scripts/connection.php");
    if(isset($_GET["id"])){
        $fid = $_GET["id"];
    }
    else{
        header("Location: literature.php"); 
    }

    $sql= "SELECT filename, mime_type, file_item FROM library_items WHERE library_item_id = ?"; 
    $stmt = $conn->prepare($sql);
    $stmt->bind_param('s', $fid);
    $stmt->execute();
    $stmt->bind_result($filename, $mime, $file_item);

    while($stmt->fetch()){
        $file_name = $filename;
        $mime_type = $mime;
        $file = $file_item; 
    }

    header("Content-length: ".strlen($file));
    header("Content-type: $mime_type");
    header("Content-disposition: download; filename=$file_name"); 
    echo $file;

    mysqli_close($conn);

我已经尝试了我能想到的一切,包括添加obj_flush()命令以及它仍然给我带来同样的错误。我在这方面做错了什么?

以下是将文件插入数据库的代码的编辑。

session_start();

    $display = trim($_POST["file-display-name"]);
    $company = trim($_POST["companies"]);
    $lib_cat = trim($_POST["library-cats"]);

    if(empty($display) || empty($company) || empty($lib_cat)){
        $_SESSION["errormsg"] = "Required information is missing please fill out all required fields.";
        header("Location: ../library.php");
    }
    else{
        $file_name = $_FILES['library-file']['name'];
        $tmp_name = $_FILES['library-file']['tmp_name'];
        $file_size = $_FILES['library-file']['size'];
        $file_type = $_FILES['library-file']['type'];

        $fp = fopen($tmp_name, 'r');
        $content = fread($fp, filesize($tmp_name));
        $content = addslashes($content);
        fclose($fp);

        if(!get_magic_quotes_gpc()){
            $file_name = addslashes($file_name);    
        }

        if(empty($content)){
            $_SESSION["errormsg"] = "Required information is missing please fill out all required fields.";
            header("Location: ../library.php"); 
        }
        else{   
            require_once("connection.php");

            // Insert the logo into the companies photo table
            $sql = "INSERT INTO library_items(filename, mime_type, file_size, file_item, display_name, company_id, library_category_id) VALUES(?,?,?,?,?,?,?)";

            $stmt = $conn->prepare($sql);
            $stmt->bind_param('sssssss', $file_name, $file_type, $file_size, $content, $display, $company, $lib_cat);
            if(!$stmt->execute()){
                $_SESSION["errormsg"] = "Failed to add library item: ".mysqli_error();
                header("Location: ../library.php");
            }
        }
        unset($_SESSION["errormsg"]);

        $_SESSION["successmsg"] = "Library Item successfully added into the database.";
        header("Location: ../library.php");
    }

更新: 我现在有文件下载并尝试显示双击下载的文件打开。它告诉我有一个无效的colorSpace。据我所知,当文件上传到数据库时,这是一个问题。从我的上传文件中发布的是我没有正确做的事情吗?

2 个答案:

答案 0 :(得分:1)

您需要进行以下更改。在插入文件中 而不是

$content = addslashes($content);

使用

$content = base64_encode($content);

因此,在下载时,请对其进行解码。

$file = base64_decode($file_item);

替换以下代码

header("Content-type: '".$mime_type."'");
header("Content-Disposition: inline; filename='".$file_name."'");
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
readfile($file);

header("Content-length: ".strlen($file));
header("Content-type: $mime_type");
header("Content-disposition: download; filename=$file_name"); 
echo $file;

答案 1 :(得分:0)

检查下载文件的大小是否正确(与数据库中的文件大小匹配)。如果是,则应调试将文件插入数据库的部分。如果不是 - 在将文件发送到浏览器之前检查是否有任何内容被打印出来 - 也许scripts/connection.php打印出类似空行,错误消息或BOM的内容? 如果找不到,请尝试打开输出缓冲并在发送文件前调用ob_clean()

对不起我的英语,我希望这是可以理解的。