【问题标题】:Site gets unresponsive after file download. What do I do wrong?文件下载后网站无响应。我做错了什么?
【发布时间】:2010-12-13 01:23:29
【问题描述】:

我有下面的代码,用于从 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);
}

【问题讨论】:

    标签: php http download


    【解决方案1】:

    在发送任何下载标头之前致电session_write_close()

    this comment:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 嗯,它是这样的:在 mac 上:- 在 safari 上,它对相应会话中的相应用户完全没有响应。 - 在其他浏览器(ff、opera、chrome beta)上,它变得无响应,直到下载完成,然后一切恢复正常。在 Windows 上 - 在 ff、crome、opera 和 ie AND safari 上,它变得无响应,直到下载完成,然后一切恢复正常。
      【解决方案3】:

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

      【讨论】:

      • 我有一个 exit() 但在上面的代码和出口之间还有几行我需要的代码。
      猜你喜欢
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 2018-07-31
      • 2020-10-17
      • 1970-01-01
      相关资源
      最近更新 更多