PHP正在读取文件而不是下载

时间:2012-04-03 14:40:30

标签: php .htaccess

我有下面的脚本用于使用PHP从文件夹下载文件,它在本地工作但在线它正在下载的页面上读取和打印。

if( $result && count($result) > 0){
    $row = $result[0];
    $book = true;
    $Location = './files/';
    $bookLocation = $Location . $row['file_name']; // exampe: report.zip
    if( file_exists( $bookLocation ) ){
        $fileLocation = $bookLocation;
        $file_size = filesize($fileLocation);
        echo 'Please wait downloading the file....';
        header('Content-Description: File Transfer');
        header('Content-Type: application/force-download');
        header('Content-Disposition: attachment; filename=' . $row['file_name']);
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . $file_size);
        ob_clean();
        flush();
        readfile($fileLocation);
        exit;      
    }else{
        echo '<h3>Sorry!, file not found...</h3>';
    }
}

.htaccess脚本

RewriteEngine on

RewriteRule ^$ index.html
RewriteRule ^index.html$ index.php

RewriteRule ^([0-9]{1,9})(/)([^/\.]+[^/\.]+)(_+[^/\.]+)(\.html|)/?$ index.php?id=$1&cat=$3
RewriteRule ^([^/\.]+[^/\.]+)(\.html|)/?$ index.php?page=$1
RewriteRule ^(.*)(/)([0-9]{1,9})(/)(.*)(\.html|)/?$ index.php?view_file=$3&file=$5
RewriteRule ^(.*)(/)([0-9]{1,9})(/)(.*)(\.htm)/?$ index.php?download=$3

RewriteRule ^(author)(/)(.*)(.html)/?$ index.php?user=$1

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

在某些浏览器中,您可能会将其设置为自动下载并运行该特定文件类型。

如果是这种情况,则无法“修复”此问题。浏览器决定如何处理该文件,即使您告诉它下载它,用户可能已经告诉它直接运行。

大编辑

虽然我之前的评论是正确的,但您的代码中存在一个主要问题:

    $file_size = filesize($fileLocation);
    echo 'Please wait downloading the file....';
    header('Content-Description: File Transfer');

必须删除该echo声明。它必然会导致问题,例如标题未被发送。考虑到你的描述,我会说这是你的问题。

一旦发送任何内容,您就无法发送更多标题。

答案 1 :(得分:0)

正如Christian建议的那样,您必须删除代码中的echo语句。如果在此之后它不起作用,请尝试替换

header('Content-Type: application/force-download');

header('Content-Type: application/octet-stream');