文件下载后,网站无响应。我做错了什么?

时间:2009-11-04 14:56:42

标签: php http download

我有以下代码用于从HDD下载文件。我得到的问题是,如果我在中间停止下载或下载结束后,该网站将无法响应。知道为什么吗?环境是LAMP。

.
.
.
// get mime type
if ($dwld_allowed_ext[$fext] == '') {
    $mtype = '';
    // mime type is not set, get from server settings
    if ($file_type == null) {
        if (function_exists('mime_content_type')) {
            $mtype = mime_content_type($file_path);
        }
        else if (function_exists('finfo_file')) {
            $finfo = finfo_open(FILEINFO_MIME); // return mime type
            $mtype = finfo_file($finfo, $file_path);
            finfo_close($finfo);
        }
    }
    else {
        $mtype = $file_type;
    }
    if ($mtype == '') {
        $mtype = "application/force-download";
    }
}
else {
    // get mime type defined by admin
    $mtype = $dwld_allowed_ext[$fext];
}

$asfname = $fname;

// set headers
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: $mtype");
header("Content-Disposition: attachment; filename=\"$asfname\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $fsize);

// download
// @readfile($file_path);
$file = @fopen($file_path,"rb");
if ($file) {
    while(!feof($file)) {
        print(fread($file, 1024*8));
        flush();
        if (connection_status()!=0) {
            @fclose($file);
            die();
        }
    }
    @fclose($file);
}

3 个答案:

答案 0 :(得分:2)

在发送任何下载标题之前立即致电session_write_close()

请参阅this comment

  

值得注意的是,如果你的   网站使用前端控制器   会话,你发送一个大文件   用户; 你应该结束会议   在发送文件之前,   否则用户将无法   继续浏览网站   文件正在下载。

答案 1 :(得分:0)

它变得完全没有反应吗?其他用户无法访问?其它浏览器?我问,因为我有几个站点停止大页面加载将挂起FireFox很长一段时间。其他浏览器(在同一台计算机上)和其他用户仍可以正常访问该网站。显然,在我的情况下,FF挂起但网站还可以。

编辑:在阅读完代码之后,你的文件关闭命令在while循环中检查eof似乎有点可疑。尝试使用readfile命令替换正在执行的整个文件:http://us2.php.net/manual/en/function.readfile.php

答案 2 :(得分:0)

尝试在打印文件后添加exit();(在提供的剪辑中的最后}之后)。这将阻止PHP解析其余的代码,这也是您可能遇到问题的原因之一。