2013-02-09 8 views
6

Ich bekomme Zip-Datei mit folgendem Code ohne Fehler heruntergeladen, aber die heruntergeladene Zip-Datei ist leer oder beschädigt und die Größe ist immer etwa 200 Bytes. , d. H. Ich kann diese Zip-Datei nicht öffnen. Auch ZipArchive :: getStatusString() zeigt auch "kein Fehler"Erhalten beschädigte oder leere Zip von ZipArchive php

Code ist:

public function getzip(){ 
    global $config; 
    $files=array(); 
    if(isset($_COOKIE['hashes'])){ 
     $hashes=explode(',',$_COOKIE['hashes']); 
     for ($i=0; $i <count($hashes); $i++) { 
      array_push($files,$config["domain"]."/download/".$hashes[$i]); 
     } 
    } 
    if(count($files)){ 
     $zipname='basket.zip'; 
     $zip = new ZipArchive; 
     $zip->open($zipname,ZipArchive::CREATE); 
     foreach ($files as $key=>$value) { 
      $zip->addFile($value); 
     } 
     $status=$zip->getStatusString(); 
     $zip->close(); 

    if(!$zipname) 
    { 
     echo "Nothing in Basket"; 
    } 
    else 
    { header('Content-Description: File Transfer'); 
     header('Content-Type: application/zip'); 
     header('Content-Disposition:attachment; filename='.basename($zipname)); 
     header('Content-Length:'.filesize($zipname)); 
     readfile($zipname); 
    } 
} 
+0

es gibt mir falsch. Das bedeutet, dass das Verzeichnis $ zipname nicht erstellt wird. Aber ich bekomme keine msg von "Nothing in Basket" anstatt eine Zip-Datei heruntergeladen zu bekommen. –

Antwort

3

Dies ist meine beste Schätzung. Was hier falsch läuft, ist, dass in Ihrem Array $files die Werte, die Sie speichern, wahrscheinlich keine tatsächlichen Pfade zu Dateien sind.

Erinnern Sie: Sie können URLs in $zip->addfile() nicht übergeben, Sie benötigen Ihre tatsächlichen Dateien.

5

Versuchen Sie den vollständigen Dateipfad und den Namen kurz vor $zip->close();

$filename = $zip->filename; 

Und Gebrauch bekommen, dass anstelle von $zipname beim Lesen der Datei und beim Abrufen der Dateigröße

+0

@Pony Überprüfen Sie dies auch .. Immer noch das gleiche Problem. Ich denke, Verzeichnis für die Datei wird nicht erstellt. Auch ich überprüft 'var_dump ($ filename)' ist zeigen genauen Pfad. –

+0

Haben Sie diese Variable vor dem Aufruf von '$ zip-> close()'? –

+0

Arbeitete wie ein Charme! Vielen Dank :) – Scott

0

Selbst schwere diese Frage herausgefunden wurde, werde ich schreiben, was ich herausgefunden habe, wie beschädigte Reißverschlüsse erstellt werden können:

, wenn sie ein ZIP-Archiv, das Sie oft mit Echo-/print_r Befehle debuggen wird. Wenn Sie diese nicht löschen, ist die Ausgabe-Zip-Datei beschädigt.

Beispiel basiert auf der Frage:

public function getzip(){ 
    global $config; 
    $files=array(); 
    if(isset($_COOKIE['hashes'])){ 
     $hashes=explode(',',$_COOKIE['hashes']); 
     for ($i=0; $i <count($hashes); $i++) { 
      array_push($files,$config["domain"]."/download/".$hashes[$i]); 
     } 
    } 
    if(count($files)){ 
     $zipname='basket.zip'; 
     $zip = new ZipArchive; 
     $zip->open($zipname,ZipArchive::CREATE); 
     foreach ($files as $key=>$value) { 
      $zip->addFile($value); 
     } 
     $status=$zip->getStatusString(); 
     $zip->close(); 

    if(!$zipname) 
    { 
     echo "Nothing in Basket"; 
    } 
    else 
    { 
     // to fix your corrupt zip file, remove this line. 
     echo 'THIS IS AN EXAMPLE DEBUG: ' . $zipname; 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/zip'); 
     header('Content-Disposition:attachment; filename='.basename($zipname)); 
     header('Content-Length:'.filesize($zipname)); 
     readfile($zipname); 
    } 
} 
1

auf diesen Thread Hinzufügen obwohl das ursprüngliche Problem, da ich ein paar Stunden mit einem ähnlichen Problem hat gerade gelöst ist.

Es stellt sich heraus, dass alle Dateien vorhanden sein müssen, wenn Sie $ zip-> close() ausführen, unabhängig davon, ob Sie $ zip-> addFile() verwenden, um sie hinzuzufügen.

Wenn Sie also temporäre Dateien erstellen, diese zu Ihrer Zip-Datei hinzufügen und diese dann löschen, bevor Sie close() verwendet haben, wird möglicherweise ein leeres/beschädigtes Archiv angezeigt.

0

Ich habe das gleiche Problem gelöst, indem ich den Code in denselben Ordner verschoben habe, in dem sich die Dateien befanden, die ich zum Zip-Archiv hinzufügen wollte.

Verwandte Themen