2016-04-20 7 views
1

Kann mir jemand einen Hinweis geben, was falsch ist? Ich habe ein Skript, das im Handumdrehen eine ZIP-Datei generiert und diese dann mit X-Sendfile und Lighttpd zum Download bereitstellt. Alles scheint zu funktionieren, aber meine heruntergeladene Datei ist ein paar Bytes weniger im Vergleich zu der ZIP-Datei, die auf dem Server erstellt wurde, und natürlich, weil es der Header der Datei ist, die fehlt, führt es zu einer zerbrochenen Zip-Datei. Hier ist der relevante Teil meines Skripts:Lighttpd X-Sendfile beschädigte Dateien

<?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(); 
    } 
?> 

Der Reißverschluss auf dem Server tmp-Ordner ist in Ordnung, aber der heruntergeladene Inhalt beschädigt ist.

Antwort

0

Nachdem ich eine Weile herumgebastelt habe, fand ich die Lösung, aber nicht sicher, was sie verursacht hat. Ich brauchte die Dateigröße Header zu setzen, bevor die Datei tatsächlich zu X-Sendfile vorbei, so dass der Code sieht wie folgt nun:

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

Dies ist jedoch nicht als Anforderung in der Lighttpd Wiki angegeben, so dass es sein könnte, ein Käfer.

Das Problem war ich hatte zlib.compression auf und ich versuchte, eine ZIP-Datei zu senden, die doppelte Komprimierung ergab. Das Ausschalten von zlib.compression zur Laufzeit hat das Problem behoben.