PHP Force下载会生成损坏的文件

时间:2015-10-14 16:54:25

标签: php html

首先......我知道这个问题之前已经在这个网站上多次讨论过了,我一直在阅读过去几个小时的评论和解决方案,但没有任何帮助。

我在此处发布的代码已被修整,但仍包含我面临的问题。

我已经创建了一个小脚本来强制使用PHP下载。这只是我试图在我的网站上使用的代码的一部分,因为我不想用太多不相关的代码向您发送垃圾邮件,但它仍然包含错误的输出。

此代码中的所有内容都使用10.6KB的.PNG文件进行测试

注意:原始问题已被删除,因为它已被解决。但是,当我将我的代码片段添加到我的网站时,我遇到了另一个问题。

我创建了一个下载文件的函数:

<?php
function download_file($file) 
{
    $known_mime_types=array(
        "htm" => "text/html",
        "exe" => "application/octet-stream",
        "zip" => "application/zip",
        "doc" => "application/msword",
        "jpg" => "image/jpg",
        "php" => "text/plain",
        "xls" => "application/vnd.ms-excel",
        "ppt" => "application/vnd.ms-powerpoint",
        "gif" => "image/gif",
        "pdf" => "application/pdf",
        "txt" => "text/plain",
        "html"=> "text/html",
        "png" => "image/png",
        "jpeg"=> "image/jpg"
    );  
    if(!is_readable($file)) die('<p class="error">File not found or inaccessible!</p>');

    $file_extension = strtolower(substr(strrchr($file,"."),1));
    if(array_key_exists($file_extension, $known_mime_types)){
        $mime_type=$known_mime_types[$file_extension];
    } else {
        $mime_type="application/force-download";
    };

    $fsize = filesize($file);

    header('Content-Type: ' .$mime_type);
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: '.$fsize);
    header('Accept-Ranges: bytes');
    header('Connection: Keep-Alive');
    header('Expires: 0');
    header('Pragma: public');
    header('Cache-Control:');
    readfile($file);
    exit();
}
?>

我从中调用函数的download.php:

<!DOCTYPE html>
<?php
require_once 'connect.inc.php';
require_once 'core.inc.php';
require_once 'download_file.php';
?>
<html>
<head>
    <title>x3d Download</title>
    <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
    <link rel="stylesheet" href="css/styles.css" type="text/css"/>  
    <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</head>
<body>
<?php
if (loggedin())
{
    include_once 'navbar_loggedin.php';
}
else 
{
    include_once 'navbar_loggedout.php';
}
?>
<div class="container" width="900px">
    <h2>Downloads</h2>
<?php
    $sql = "SELECT * FROM `files`";
    $result = mysql_query($sql);
    if (!$result)
    {
        echo '<p>No downloads available.</p>';
    }
    else 
    {
        echo '<table class="table table-hover"><tr>';
        echo '<tr><th>Filename</th>';
        echo '<th>Filetype</th>';
        echo '<th></th>';
        if (loggedin())
        {
            if (getuserlevel($_SESSION['user_id']) == 'Administrator')
            {
                echo '<th></th>';
            }
        }
        while($row = mysql_fetch_assoc($result)) 
        {
            echo '<tr><td><p>'.$row['file_name'].'</p></td>';
            echo '<td><p>'.$row['file_type'].'</p></td>';
            echo '<td><a href="download.php?download='.$row['file_id'].'"><span class="glyphicon glyphicon-download-alt" aria-hidden="true"></span></a></td>';
            if (loggedin())
            {
                if (getuserlevel($_SESSION['user_id']) == 'Administrator')
                {
                    echo '<td><a class="red" href="download.php?delete='.$row['file_id'].'"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></a></td>';
                }
            }
        } 
        echo '</tr></table>';
    }
?>
<?php
if (isset($_GET['download'])) 
{
    $sql = "SELECT `file_name` FROM `files` WHERE `file_id`='".$_GET['download']."'";
    if ($result = mysql_query($sql)) 
    {
        $row = mysql_fetch_assoc($result);
        $file = "uploads/" . $row['file_name'];
        download_file($file);
    }
}

if (isset($_GET['delete'])) 
{
    $sql = "SELECT `file_name` FROM `files` WHERE `file_id`='".$_GET['delete']."'";
    if ($result = mysql_query($sql)) 
    {
        $row = mysql_fetch_assoc($result);
    }

    if ($row['file_name'] == "")
    {
        echo '<p class="error">File does not exist.</p>';
    }
    else
    {
    $filepath = "uploads/".$row['file_name'];
    $sql = "DELETE FROM `files` WHERE `file_id`='".$_GET['delete']."'";
    if (file_exists($filepath)) 
    {
        try
        {
            if (unlink($filepath))
            {
                if ($result = mysql_query($sql))
                {
                    header('Location: download.php');
                }
            }
        }
        catch (Exception $e)
        {
            echo '<p class="error">Could not delete file.</p>';
        }
    }
    }
}
?>
</div>
</body>
</html>

调用该函数的代码已经过测试,我的sql查询确实返回了正确的值。

图片包含我的html源代码和原始图片的一部分......

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:4)

你的代码很好。但是你下载的是一个致命的错误,而不是图像:

<br />
<b>Fatal error</b>:  Call to undefined function fileread() in <b>/var/www/html/test.php</b> on line <b>18</b><br />

使用fileread($file);更改readfile($file);,它应该有效。

下次有“140字节的损坏文件”时,请尝试将其作为文本文件打开。