Lighttpd X-Sendfile 损坏的文件
Lighttpd X-Sendfile corrupted files
谁能告诉我哪里出了问题?我有一个脚本可以动态生成一个 ZIP 文件,然后使用 X-Sendfile 和 lighttpd 提供下载。一切似乎都在工作,但与在服务器上创建的 zip 文件相比,我下载的文件少了几个字节,当然是因为缺少文件的 header 导致 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 之前,我需要设置文件大小 header,所以现在的代码如下所示:
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 已解决此问题。
谁能告诉我哪里出了问题?我有一个脚本可以动态生成一个 ZIP 文件,然后使用 X-Sendfile 和 lighttpd 提供下载。一切似乎都在工作,但与在服务器上创建的 zip 文件相比,我下载的文件少了几个字节,当然是因为缺少文件的 header 导致 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 之前,我需要设置文件大小 header,所以现在的代码如下所示:
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 已解决此问题。