2

我正在尝试从 Ubuntu 的 /tmp 文件夹下载一个 zip 文件。但是,当我运行 PHP 代码时,它会在浏览器上显示垃圾文本,而不是显示下载框。我尝试使用一个简单的文本文件,而不是向我显示下载对话框,而是将其内容打印在浏览器上。为什么这种强制下载不起作用。下面是代码。

if (file_exists($dir.$filename)) {
            header("Content-type: application/force-download");
            header("Content-Transfer-Encoding: Binary");
            header("Content-length: ".filesize($dir.$filename));
            header('Content-disposition: attachment; filename='.basename($dir.$filename));
            readfile($dir.$filename);
            exit(0);
        }

    `    
4

2 回答 2

5

好吧,给任何浏览器一个 MIME 类型“应用程序/强制下载”,浏览器将不知道如何处理它。

因为它是一个 zip 文件,所以 MIME 类型应该是“application/octet-stream”或“application/zip”。

if (file_exists($dir . $filename)) {
        header("Content-type: application/zip");
        header("Content-Transfer-Encoding: Binary");
        header("Content-length: " . filesize($dir . $filename));
        header('Content-disposition: attachment; filename=' . basename($dir . $filename));
        readfile($dir . $filename);
        exit(0);
    }
于 2011-12-15T09:15:02.827 回答
0

您无法将整个文件读入内存。更改您的 readfile($_REQUEST['file']); 进入:

$handle=fopen($_REQUEST['file'], 'rb');
while (!feof($handle))
{
    echo fread($handle, 8192);
    flush();
}
fclose($handle);

这将读取 8kb 的文件,然后将其推送到客户端,依此类推……它不会消耗太多内存(因为它不会一次读取整个文件)。

此外,当强制下载时,始终使用application/octet-stream这将确保正确发送二进制文件。

于 2014-05-03T19:23:06.853 回答