如何编写PHP脚本以进行正确的文件下载?

时间:2012-06-29 16:54:09

标签: php http cross-browser cache-control

我无法解决文件下载问题。在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';
}

5 个答案:

答案 0 :(得分:1)

尝试在exit之后加readfile,我认为这可以解决您的问题

答案 1 :(得分: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();
}

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

希望这会有所帮助:)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这是你的问题:

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

尝试为您的archivo命名,例如:

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

答案 4 :(得分:0)

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

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

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