0

我无法解决文件下载问题。在 Chrome 中,下载工作正常。在 Firefox 中,它会在文件末尾生成一些 HTML 标题,例如:

<!DOCTYPE .....>
...
...

对于其他一些浏览器,下载的文件也会丢失一些行。如何编写脚本以使其真正适用于许多浏览器?这是我当前的代码:

private  function downloadRawFileHelper($file) {
    if (ini_get('zlib.output_compression')) {
        ini_set('zlib.output_compression', 'Off');
    }
    if (!file_exists($file)) {
        die('File Not Found');
    }

    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private", false);
    header("Content-Type: text/php");
    header("Content-Disposition: attachment; filename=\"". basename($file). "\"");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: " . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    $this->view = 'fileedit';
}
4

5 回答 5

1

尝试放一个exit之后readfile,我认为这会解决你的问题

于 2012-06-29T16:58:21.107 回答
0

这是你的问题:

header("Content-Disposition: attachment; filename=\"". basename($file). "\"");

尝试为您的档案命名,例如:

header("Content-Disposition: attachment; filename=\"". basename($file). "filename.extension\"");
于 2012-06-29T17:10:42.727 回答
0

调试 HTTP 问题的最佳方法是实际检查发送的 HTTP 消息。今天的浏览器使这变得非常容易。

如果该站点是公开的,您可以尝试 redbot.org 来检查响应。

最后,您发送了大量未定义和/或无用的响应头字段,例如“Content-Transfer-Encoding”或 Cache-Control 中的“check”指令。

于 2012-06-30T06:43:30.590 回答
0

我找不到代码有任何问题。您可以尝试在函数末尾添加exit()或。die()将其更改为:

private  function downloadRawFileHelper($file) {
    if (ini_get('zlib.output_compression')) {
        ini_set('zlib.output_compression', 'Off');
    }
    if (!file_exists($file)) {
        die('File Not Found');
    }

    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private", false);
    header("Content-Type: text/php");
    header("Content-Disposition: attachment; filename=\"". basename($file). "\"");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: " . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    $this->view = 'fileedit';
    exit();
}

您正在将文件输出到浏览器。所以你需要在那之后停止脚本执行。

希望这可以帮助 :)

于 2012-06-29T16:57:23.007 回答
0

flush()添加之前ob_end_clean();exit()之后readfile()。此外,您可能会考虑使用 X-SendFile 而不是纯 PHP 将文件发送到客户端,因为在大文件的情况下这会占用宝贵的资源。

于 2012-06-29T16:58:42.973 回答