下载后可以打开PDF的php

发布于 2025-01-27 06:43:24 字数 3252 浏览 2 评论 0原文

在我的项目中,我需要上传PDF文件并之后下载。

一切正常,但是下载PDF文件后,它被折磨了,我看不到它。

如果我尝试使用Adobe Acrobat Reader打开它,我会发现此错误,上面说该文件被折断并且没有正确编码。

有人可以帮我解决这个问题吗?谢谢!

PHP脚本以下载和上传:

<?php
// connect to the database
require_once 'connectionoop.php';
require_once 'core/init.php';
 
$query1 = sprintf("SELECT files.id, files.name,files.size ,files.downloads , association.Aname ,projects.Pname,files.project 
    FROM files
    INNER JOIN projects ON files.project = projects.id INNER JOIN association ON projects.Aid = association.id
");
$result1 = $mysqli->query($query1);

$files=array();
foreach ($result1 as $row) {
  $files[] = $row;
}
// Uploads files
if (isset($_POST['save'])) { // if save button on the form is clicked
    // name of the uploaded file
    $filename = $_FILES['myfile']['name'];
    $proj = $_POST['Aid'];
    // destination of the file on the server
    $destination = 'uploads/' . $filename;

    // get the file extension
    $extension = pathinfo($filename, PATHINFO_EXTENSION);

    // the physical file on a temporary uploads directory on the server
    $file = $_FILES['myfile']['tmp_name'];
    $size = $_FILES['myfile']['size'];

    if (!in_array($extension, ['zip', 'pdf', 'docx'])) {
        echo "You file extension must be .zip, .pdf or .docx";
    } elseif ($_FILES['myfile']['size'] > 1000000) { // file shouldn't be larger than 1Megabyte
        echo "File too large!";
    } else {
        // move the uploaded (temporary) file to the specified destination
        if (copy($file, $destination)) {
            $query = sprintf("INSERT INTO files (name, size, downloads , project) VALUES ('$filename', $size, 0,$proj)");
        //execute query
            $result = $mysqli->query($query);
            $sql = "INSERT INTO files (name, size, downloads) VALUES ('$filename', $size, 0)";
            $pr=new Project($proj);
            $pr->update(array(
                'hasfile' =>1
            ));
            Redirect::to('downloads.php');

        } else {
            echo "Failed to upload file.<br>".$destination;
        }
    }
}

if (isset($_GET['file_id'])) {
    $id = $_GET['file_id'];


   

    $query2 = sprintf("SELECT * FROM files WHERE id=$id");
    // fetch file to download from database
    $result2 = $mysqli->query($query2);
    $data = array();
    foreach ($result2 as $row) {
    $data[] = $row;
    }
    $filepath = 'uploads/' .$data[0]['name'];
    

    if (file_exists($filepath)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename=' . basename($filepath));
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize('uploads/' . $data['name']));
        readfile('uploads/' . $data['name']);

        // Now update downloads count
        $newCount = $data['downloads'] + 1;
        $query3 = sprintf("UPDATE files SET downloads=$newCount WHERE id=$id");
    // fetch file to download from database
        $result3 = $mysqli->query($query3);
        exit;
    }

}


in my project I need to upload pdf file and download it afterwards.

everything works fine , but after i download the pdf file its been currupted and i can't view it.

if i try to open it with Adobe Acrobat Reader i get this error that says the file been currupted and didn't encoded correctly.

can someone help me to resolve this? thanks!

php script for download and upload:

<?php
// connect to the database
require_once 'connectionoop.php';
require_once 'core/init.php';
 
$query1 = sprintf("SELECT files.id, files.name,files.size ,files.downloads , association.Aname ,projects.Pname,files.project 
    FROM files
    INNER JOIN projects ON files.project = projects.id INNER JOIN association ON projects.Aid = association.id
");
$result1 = $mysqli->query($query1);

$files=array();
foreach ($result1 as $row) {
  $files[] = $row;
}
// Uploads files
if (isset($_POST['save'])) { // if save button on the form is clicked
    // name of the uploaded file
    $filename = $_FILES['myfile']['name'];
    $proj = $_POST['Aid'];
    // destination of the file on the server
    $destination = 'uploads/' . $filename;

    // get the file extension
    $extension = pathinfo($filename, PATHINFO_EXTENSION);

    // the physical file on a temporary uploads directory on the server
    $file = $_FILES['myfile']['tmp_name'];
    $size = $_FILES['myfile']['size'];

    if (!in_array($extension, ['zip', 'pdf', 'docx'])) {
        echo "You file extension must be .zip, .pdf or .docx";
    } elseif ($_FILES['myfile']['size'] > 1000000) { // file shouldn't be larger than 1Megabyte
        echo "File too large!";
    } else {
        // move the uploaded (temporary) file to the specified destination
        if (copy($file, $destination)) {
            $query = sprintf("INSERT INTO files (name, size, downloads , project) VALUES ('$filename', $size, 0,$proj)");
        //execute query
            $result = $mysqli->query($query);
            $sql = "INSERT INTO files (name, size, downloads) VALUES ('$filename', $size, 0)";
            $pr=new Project($proj);
            $pr->update(array(
                'hasfile' =>1
            ));
            Redirect::to('downloads.php');

        } else {
            echo "Failed to upload file.<br>".$destination;
        }
    }
}

if (isset($_GET['file_id'])) {
    $id = $_GET['file_id'];


   

    $query2 = sprintf("SELECT * FROM files WHERE id=$id");
    // fetch file to download from database
    $result2 = $mysqli->query($query2);
    $data = array();
    foreach ($result2 as $row) {
    $data[] = $row;
    }
    $filepath = 'uploads/' .$data[0]['name'];
    

    if (file_exists($filepath)) {
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename=' . basename($filepath));
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize('uploads/' . $data['name']));
        readfile('uploads/' . $data['name']);

        // Now update downloads count
        $newCount = $data['downloads'] + 1;
        $query3 = sprintf("UPDATE files SET downloads=$newCount WHERE id=$id");
    // fetch file to download from database
        $result3 = $mysqli->query($query3);
        exit;
    }

}


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

韵柒 2025-02-03 06:43:24

它应该是标题(“ content-type:application/pdf”);

It should be header("Content-type:application/pdf");

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文