Zip文件下载,但无效?

时间:2012-05-30 13:10:23

标签: php download

我使用此代码使用户能够下载zip文件:

if(file_exists($filename)){
         header("Content-Disposition: attachment; filename=".basename(str_replace(' ', '_', $filename)));
         header("Content-Type: application/force-download");
         header("Content-Type: application/octet-stream");
         header("Content-Type: application/download");
         header("Content-Description: File Transfer");
         header("Content-Length: " . filesize($filename));
         flush();

         $fp = fopen($filename, "r");
         while (!feof($fp))
         {
             echo fread($fp, 65536);
             flush();
         }
         fclose($fp);
     exit;
}

下载文件时,它只下载25,632千字节的数据。但是zip文件是26,252千字节......

为什么浏览器会获得所有25MB然后停止?

我检查了Content-Length标题以确保它是正确的,它是......

修改

在firefox中,当我下载文件时,它会显示“25mb”,因此浏览器认为25mb是COMPLETE数量...但是,echo的内容长度是26252904?

5 个答案:

答案 0 :(得分:3)

在代码

之前添加此内容
ob_clean();
ob_end_flush();

答案 1 :(得分:2)

您的header('Content-Type ...)电话无效,因为只有最后一个电话会被发送到浏览器。

下载由Content-Disposition: attachment触发。如果您要发送zip文件,则应发送实际的Content-Type: application/zip

最后,你的阅读循环是不必要的。

总而言之,您的代码应如下所示:

if (file_exists($filename)) {
    $quoted_filename = basename(addcslashes($filename, "\0..\37\"\177"));
    header("Content-Disposition: attachment; filename=\"{$quoted_filename}\"");
    header('Content-Type: application/zip');
    header('Content-Length: '.filesize($filename));
    readfile($filename);
}

答案 2 :(得分:0)

使用单个MIME类型来表示数据。

在这种情况下使用application/octet-stream会很好。这是你事先不知道MIME的时候。当你知道它时,你必须把它。不要使用多个内容类型标头。

通常,当浏览器不知道如何处理特定MIME时,它将触发下载过程。此外,使用Content-disposition: Attachment; ..可以确保它。

存在一个简单的readfile($filename),它会将文件的字节发送到请求流程,如下所示:

header("Content-disposition: attachment;filename=" . basename($filename);
readfile($filename);

答案 3 :(得分:0)

我有类似的问题。该文件在Firefox中下载得很好,但在IE中没有。似乎Apache正在压缩文件,IE无法解压缩,因此文件已损坏。解决方案是禁用Apache中的gzipping。您还可以检查PHP是否在运行时不进行gzipping并禁用它。 对于Apache,您可以尝试:

SetEnv no-gzip 1

对于PHP,在.htaccess:

php_flag zlib.output_compression on

答案 4 :(得分:0)

这个答案绝对不是真正的答案。

然而我确实让它工作......我只是将Content-Length设置为30000000.因此它认为文件比实际大,然后它全部下载。

丑陋的黑客,我知道,但我找不到任何其他方式