2013-11-23 5 views
6

Ich versuche, Dateien aus einem Ordner mit dem Namen "Upload" zu zippen und herunterzuladen. Zip-Datei wird heruntergeladen, aber ich konnte sie nicht öffnen (extrahieren). Ich erhalte einen Fehler wie "Das Archiv ist entweder im unbekannten Format oder beschädigt".Zip-und Download-Dateien mit PHP

Ich habe den folgenden Code gefunden, um den Ordner zu komprimieren.

<?php 
    $files = "upload/".array('Dear GP.docx','ecommerce.doc'); 
    $zipname = 'filename.zip'; 
    $zip = new ZipArchive; 
    $zip->open($zipname, ZipArchive::CREATE); 
    foreach ($files as $file) { 
     $zip->addFile($file); 
    } 
    $zip->close(); 
    header('Content-Type: application/zip'); 
    header('Content-disposition: attachment; filename=filename.zip'); 
    header('Content-Length: ' . filesize($zipfilename)); 
    readfile($zipname); 
?> 
+0

Das Problem bezieht sich wahrscheinlich auf '$ files =" upload/". Array ('Dear GP.docx', 'ecommerce.doc');'. Versuchen Sie, Fehler anzuzeigen und nach PHP-Fehlern zu suchen.Sie versuchen, ein Array als Zeichenfolge zu generieren. –

Antwort

20

Vielen Dank für Ihre Antworten.

<?php 
    $files = array('Dear GP.docx','ecommerce.doc'); 

    # create new zip opbject 
    $zip = new ZipArchive(); 

    # create a temp file & open it 
    $tmp_file = tempnam('.',''); 
    $zip->open($tmp_file, ZipArchive::CREATE); 

    # loop through each file 
    foreach($files as $file){ 

     # download file 
     $download_file = file_get_contents($file); 

     #add it to the zip 
     $zip->addFromString(basename($file),$download_file); 

    } 

    # close zip 
    $zip->close(); 

    # send the file to the browser as a download 
    header('Content-disposition: attachment; filename=Resumes.zip'); 
    header('Content-type: application/zip'); 
    readfile($tmp_file); 
?> 
+0

Das war sehr nützlich, danke! –

+0

Danke! funktioniert gut! –

+0

Bearbeiten Sie den Teil dieser Antwort, der eine neue Frage stellte. [Bitte verwenden Sie ausschließlich Antworten, um die Frage zu beantworten] (// meta.stackoverflow.com/q/92107). Wenn Sie eine NEUE Frage haben, klicken Sie bitte auf die Schaltfläche [Frage stellen] (// stackoverflow.com/questions/ask). Fügen Sie einen Link zu dieser Frage hinzu, wenn es hilft, Kontext bereitzustellen. – Mogsdad

0

Bitte Code unten verwenden statt $ zip-> addFile ($ file);

<?php 
$zip->addFile($file_path, $filename); 
?> 
+0

Das ist nicht das Problem. '$ filename' ist ein [optional] (http://www.php.net/manual/en/ziparchive.addfile.php) Parameter –

+0

ok. Ich bin Zip-Datei mit Dateinamen, so dass ich Dateipfad und Dateinamen beide Option vorschlagen. –

0
$files = "upload/".array('Dear GP.docx','ecommerce.doc'); 

Sollte sein:

$files = array('upload/Dear GP.docx','upload/ecommerce.doc'); 

Wenn Sie noch Fragen haben, dann sollten Sie prüfen, ob Sie Schreibberechtigung für das aktuelle Verzeichnis. Sie können den Rückgabewert close() überprüfen, um zu überprüfen, ob die Datei tatsächlich geschrieben wurde.

$res = $zip->close(); 
var_dump($res); 

sollte die Ausgabe bool(true) sein, wenn der Schreibvorgang erfolgreich war.

Sieht aus wie Sie auch die falsche var name im filesize() Aufruf haben:

header('Content-Length: ' . filesize($zipfilename)); 

Sollte wahrscheinlich sein:

header('Content-Length: ' . filesize($zipname)); 

Sie könnten auch zusätzliche Validierung hinzufügen, um zu überprüfen, ob die Dateien, die Sie sind Hinzufügen zu der Zip tatsächlich vorhanden und vor dem Senden überprüfen Sie die Zip-Datei vorhanden ist.

Edit: Schalten Sie Anzeigefehler Sie lokal debuggen helfen:

ini_set('display_errors', 1); 
error_reporting(E_ALL); 
2

Ich hatte auf dieser Download Zip-Dateien auf meinem Mac mehr als 6 Stunden verbrachte (localhost) - Obwohl die Datei heruntergeladen wurde immer, ich kann sie nicht (immer cpgz Dateien) entpacken können. Offenbar funktionierte keine der im Stack genannten Lösungen (um eine Vielzahl von Fragen zum Zip-File-Download). Schließlich, nach Versuch und Irrtum, fand ich, dass der folgende Code funktioniert:

Keiner der Leute antwortete früher sprach über die ob_start() und wo genau Sie es setzen sollten. Wie auch immer, das alleine war nicht die Antwort - Sie müssen auch diese drei Zeilen über ob_start() verwenden.

$file=$zippath.$filename; 
if (headers_sent()) { 
    echo 'HTTP header already sent'; 
} else { 
    if (!is_file($file)) { 
     header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found'); 
     echo 'File not found'; 
    } else if (!is_readable($file)) { 
     header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden'); 
     echo 'File not readable'; 
    } else { 
     while (ob_get_level()) { 
      ob_end_clean(); 
     } 
     ob_start(); 
     header($_SERVER['SERVER_PROTOCOL'].' 200 OK'); 
     header("Content-Type: application/zip"); 
     header("Content-Transfer-Encoding: Binary"); 
     header("Content-Length: ".filesize($file)); 
     header('Pragma: no-cache'); 
     header("Content-Disposition: attachment; filename=\"".basename($file)."\""); 
     ob_flush(); 
     ob_clean(); 
     readfile($file); 
     exit; 
    } 
} 
+0

Soweit ich weiß (könnte natürlich falsch sein) hat die Zeile ob_end_clean() etwas mit dem Caching zu tun, da große Dateien vom Cache durcheinander gebracht würden. – Skytiger

0

Die Antwort ist gut, aber bitte fügen Sie diese Zeilen vor der Kopfzeile. Zip-Datei ist offen in all Zip-Software (WinZip, WinRar usw.)

if (headers_sent()) 
    { 
     // HTTP header has already been sent 
     return false; 
    } 
// clean buffer(s) 
while (ob_get_level() > 0) 
    { 
     ob_end_clean(); 
    } 
0
$zip = new ZipArchive; 
     if ($zip->open('assets/myzip.zip', ZipArchive::CREATE)) { 
      $zip->addFile('folder/bootstrap.js', 'bootstrap.js'); 
      $zip->addFile('folder/bootstrap.min.js', 'bootstrap.min.js'); 
      $zip->close(); 
      echo 'Archive created!'; 
      header('Content-disposition: attachment; filename=files.zip'); 
      header('Content-type: application/zip'); 
      readfile($tmp_file); 
     } else { 
      echo 'Failed!'; 
     } 

ich diesen Code bekam Dateien aus einem Ordner zum Download bereit.