2016-04-20 6 views
1

Может кто-нибудь дать мне подсказку о том, что не так? У меня есть сценарий, который генерирует ZIP-файл «на лету», а затем служит для его загрузки с помощью X-Sendfile и lighttpd. Кажется, что все работает, но мой загруженный файл на несколько байт меньше по сравнению с zip-файлом, созданным на сервере, и, конечно, потому что это заголовок файла, который отсутствует, приводит к сломанному zip-файлу. Вот соответствующая часть моего сценария:Lighttpd X-Sendfile поврежденные файлы

<?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 прекрасно, но загруженный контент поврежден.

ответ

0

После того, как я немного поработал, я нашел решение, но не уверен, что это вызвало его. Мне нужно установить заголовок размер файла до фактического прохождения файла в 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 во время выполнения.