php – 标题下载文件已损坏

我正试图通过我的数据库中的标题下载文件.当我将下载代码更改为使用OOP的下载代码时,我不确定为什么我下载的文件全部损坏但是当我的代码是非OOP时这样做很好.

这是我获取文件ID并调用下载函数的地方:(handleDownload.PHP)

if (isset($_GET['id'])) {
        $id = $_GET['id'];
        //pump id into function getDBFiles to pull file with matching id
        $fileData = $Download->getDBFiles($id);
        header('Content-Type:"' . $fileData[2]. '"');
        header('Content-Disposition: attachment; filename="' . $fileData[1]. '"'); 
        echo $fileData[0];
        exit;
      }

这是从数据库提取文件函数(download.PHP)

public function getDBFiles($id) {
            global $database;
            $sql = "SELECT * FROM ".self::$table_name." WHERE resume_id ='" . $id . "'";
            $result = $database->query($sql);
            if ($row = $result->fetch_array(MysqLI_ASSOC)) {  
                $name = $row['resume_title'];
                $type = $row['file_type'];
                $content = $row['resume_data']; //content of file
                //$size = $row['file_size']; //file size
                return array($content,$name,$type);
            }
        }
 $Download = new Download();
 $download =& $Download;

如果代码全部在一个页面中,如下所示,代码工作正常:

if (isset($_GET['id'])) {
    $id = $_GET['id'];
    MysqLi_select_db($con,"apples");

    $query = "SELECT * FROM resume where resume_id ='" . $id . "'";
    $result = MysqLi_query($con,$query) or die('Error,query Failed');


    if ($row = $result->fetch_array(MysqLI_ASSOC)) {
        $name = $row['resume_title'];
        $type = $row['file_type'];
        $content = $row['resume_data']; //content of file
        $size = $row['file_size']; //file size
        header('Content-Type:"' . $type . '"');
        //header('Content-length:"' . $size . '"');
        header('Content-Disposition: attachment; filename="' . $name . '"');
        //var_dump($row);
        echo $content;
    }
}

更新:
我现在得到的下载文件已损坏,而不是空白文件.这是不同下载代码输出相同文件的方式.顶部的一个来自OOP代码,而另一个来自工作的非OOP版本.

这是我的完整下载代码.

try {
    //execute retrieval of files from database
    $Download-> showDBFiles();
    //pass results to output array 
    $output = $Download->getMessages();
    //if id is set then get file from database
    if (isset($_GET['id'])) {
        $id = $_GET['id'];
        //pump id into function getDBFiles to pull file with matching id
        $fileData = $Download->getDBFiles($id);
        header('Content-Type:"' . $fileData[2]. '"');
        header('Content-Disposition: attachment; filename="' . $fileData[1]. '"'); 
        echo $fileData[0];
        die();
      }
} catch (Exception $e) {
    $result[] = $e->getMessages();
}

调用函数后,我会用foreach循环回显输出(下载链接)

<h2>Output</h2>
<?PHP if ($output) { ?>
<ul class="result">
    <?PHP
    foreach ($output as $message) {
        $id = $message['id'];
        $name = $message['name'];
        ?>
    <li><a href="handleDownload.PHP?id=<?PHP echo $id; ?>"><?PHP echo $name; ?></a></li>

    <?PHP }
?>
</ul>
在您的非OOP解决方案中检查PHP文件中的前导空格.

由于前导空格,以下代码生成损坏的文件.

<?PHP
if (isset($_GET['id'])) {...

这也适用于关闭PHP标记之后的空格(你不应该使用它).

这些字符将由您的浏览器提交,包含在下载流中并破坏整个文件.

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...