Lighttpd X-Sendfile 损坏的文件


Lighttpd X-Sendfile corrupted files

谁能给我一个提示,说明出了什么问题?我有一个脚本,它可以即时生成一个ZIP文件,然后使用X-Sendfile和lighttpd提供下载。一切似乎都在工作,但是与在服务器上创建的zip文件相比,我下载的文件少了几个字节,当然,因为它是缺少的文件的标头,所以会导致zip文件损坏。这是我脚本的相关部分:

<?php
    header("Content-Disposition: attachment; filename='"$MYVARIABLE1" . ".zip'"");
    if ($status == 1) {
        $tmp_file = tempnam('/tmp/', '');
        $dir = new RecursiveDirectoryIterator("/mnt/BLABLABLA/$MYVAR2/$MYVAR3/", FilesystemIterator::SKIP_DOTS);
        $it = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::SELF_FIRST);
        $it->setMaxDepth(1);
        $mylist = "";
        foreach ($result as $row) {
            $files = new RegexIterator($it, "/" . $row[2] . "/", RegexIterator::GET_MATCH);
            $mylist.="'"" . key(iterator_to_array($files)) . "'" ";
        }
        exec("/usr/bin/zip -qj0 $tmp_file $mylist");
        header("X-LIGHTTPD-send-file: $tmp_file" . ".zip");
        exit();
    }
?>

服务器 tmp 文件夹上的 zip 很好,但下载的内容已损坏。

经过一段时间的

修补,我找到了解决方案,但不确定它是什么原因造成的。在实际将文件传递给 X-Sendfile 之前,我需要设置文件大小标头,因此代码现在如下所示:

    exec("/usr/bin/zip -qj0 $tmp_file $mylist");
    header("Content-Length: ".filesize($tmp_file.".zip"));
    header("X-LIGHTTPD-send-file: $tmp_file" . ".zip");
    exit();

但是,这在Lighttpd Wiki中没有指定为要求,因此它可能是一个错误。

问题是我打开了zlib.compression ,我试图发送一个导致双重压缩的ZIP文件。在运行时关闭 zlib.compression 已解决此问题。