8

我正在尝试使用此代码下载 .zip 文件

<?php
    $file = "something.zip";
    $size = filesize($file);
    header('Content-type: application/octet-stream');
    header("Content-length: $size");
    header('Content-Disposition: attachment; filename="downloaded.zip"');
    readfile($file);
?>

但它似乎不起作用,即使我尝试将文件大小设置为header("Content-length: 567247784");. 我只得到一个没有声明大小的文件,或者一个像 28 字节这样的小文件。

我看了一下这个问题,我想我和发帖人有同样的问题,但他的解决方案是“存在服务器问题”。我想我也有服务器配置问题,但他的回答对我一点帮助都没有。

4

6 回答 6

23

它与 mod_deflate 阻碍有关。我花了一天时间弄乱 .htaccess 并尝试了一百万种不同的东西,最后修复了它,但我无法真正解释原因:

    header('Content-Length: '.$filesize);
    header("Content-Range: 0-".($filesize-1)."/".$filesize);

我想补充一点,我的 PHP 配置的内存少于 256MB。

于 2015-06-01T09:25:56.427 回答
1

我认为最简单和最好的方法是:

$head = array_change_key_case(get_headers($file, TRUE));
                    $filesize = $head['content-length'];
于 2014-03-17T12:21:46.137 回答
0

在这种情况下尝试删除尾随?>。之后的换行符或空格?>可以改变结果。

通常,网络服务器会自动设置 Content-Length 标头。

对于调试,您可以使用非常棒的http://fiddler2.com/来检查标头,甚至可以编写任意请求来测试您的假设。如果内容主体与Content-Length标题不同,Fiddler 将发出警告。

于 2014-01-11T17:27:08.823 回答
0

继 TeeraMusic 的伟大分析https://stackoverflow.com/a/30569921/820841之后,将 mod_deflate 确定为罪魁祸首


选项 1:(为此请求禁用 DEFLATE)

apache_setenv('no-gzip', '1');

为此请求停止 mod_deflate 的正确方法。


选项 2:(对此 Content-Type 的所有请求禁用 DEFLATE)

控制哪些文件是 DEFLATE 的选项很可能在您的.htaccessor中httpd.conf

AddOutputFilterByType DEFLATE "application/atom+xml" \
                              "application/javascript" \
                              ...
  1. 确保您实际上Content-Type为您的响应设置了正确的并且它不只是匹配 as text/html
  2. Content-Type如果您不希望它通过 mod_deflate 传递,请从此列表中删除特定。
于 2019-12-02T16:21:24.927 回答
-1

我遇到了同样的问题,在我的情况下,当我在某个 php 文件中发现<?php标签前包含一个转义字符时,它就解决了。然后,页面返回的大于通知中的$size = filesize($file);,这会导致错误。

于 2014-05-08T14:22:17.447 回答
-1

也许是这个问题: header("Content-length:" . $size); 但我可能是错的

于 2014-01-11T17:22:30.653 回答