Кто-нибудь может дать мне подсказку о том, что не так? У меня есть скрипт, который генерирует 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();
}
?>
Zip на папке tmp сервера в порядке, но загруженный контент поврежден.
Поработав некоторое время, я нашел решение, но не знал, чем оно вызвано. Мне нужно было установить заголовок размера файла перед передачей файла в 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 во время выполнения исправило проблему.
Других решений пока нет …