2016-04-27 18 views
2

Ich habe den folgenden Code einige Log-Dateien über CodeHerunterladen mehrerer Dateien innerhalb foreach Schleife Ausgabe

$files = array('../tmp/logs/debug.log', 
       '../tmp/logs/error.log'); 
    foreach($files as $file) { 
     header("Cache-Control: public"); 
     header("Content-Description: File Transfer"); 
     header("Content-Disposition: attachment; filename=$file"); 
     header("Content-Type: text/html"); 
     header("Content-Transfer-Encoding: binary"); 
     // read the file from disk 
     readfile($file); 
    } 

Aber nur laden Sie das erste Element des Arrays zum Download bereit. In diesem Fall debug.log, wenn ich die Elemente dann nur error.log. Irgendwelche Hilfe bitte?

Antwort

2

Sie können nur eine Datei pro HTTP-Anforderung herunterladen. Sobald die erste Datei gesendet wurde, geht der Browser davon aus, dass das Ende der Verarbeitung erreicht ist, und hört auf, mit dem Server zu sprechen.

Wenn Sie sicherstellen möchten, dass der Benutzer mehrere Dateien herunterlädt, besteht eine Lösung darin, sie alle auf der Server-Seite hochzuladen und dann die ZIP-Datei zum Herunterladen an den Benutzer zu senden.

2

Header werden einmal in derselben Ausführung eingerichtet. Wenn Sie eine Schleife einfügen, werden die nächsten Header nicht gesendet. Sie können die Schleife in JavaScript erstellen und mit Ajax aufrufen, aber der Benutzer wird mehrere Downloads auf einmal erhalten, so dass es Browser und Benutzerfreundlichkeit zum Absturz bringen kann.

2

Sie können nicht mehrere Dateien gleichzeitig herunterladen. Das HTTP-Protokoll wurde entwickelt, um eine Datei pro Anfrage zu senden.

Alternativ können Sie alle Ihre Protokolldateien komprimieren und als ZIP-Datei herunterladen.

Sie können die Klasse ZipArchive verwenden, um eine ZIP-Datei zu erstellen und sie zum Client zu streamen. Etwas wie:

$files = array(
      '../tmp/logs/debug.log', 
      '../tmp/logs/error.log' 
    ); 
    $zipname = 'logs.zip'; 
    $zip = new ZipArchive; 
    $zip->open($zipname, ZipArchive::CREATE); 
    foreach ($files as $file) { 
     $zip->addFile($file); 
    } 
    $zip->close(); 

und es zu streamen:

header('Content-Type: application/zip'); 
header('Content-disposition: attachment; filename='.$zipname); 
header('Content-Length: ' . filesize($zipname)); 
readfile($zipname); 
Verwandte Themen