2012-04-02 8 views
1

Ich versuche, eine ZIP-Datei mit über 1500 Pdf-Dateien zu entpacken. Die komprimierte Datei sollte in Teilen in einen Ordner entpackt werden, um den Serverspeicher nicht gleichzeitig mit einer 20-MB-Datei zu überlaufen.Packen große Reißverschlüsse in Teilen mit PHP in einen Ordner

Ich habe bereits ein Beispiel zum Entpacken in Teilen gefunden. Diese Methode erstellt jedoch kein Verzeichnis oder etwas, in dem die entpackten Dateien angezeigt werden können. Es erstellt nur eine Datei, die kein Verzeichnis ist, das wieder eine neue Postleitzahl zu sein scheint.

Diese Funktion erstellt eine Datei, die wie eine andere Zip-Datei aussieht, wie oben erläutert. Wenn ich den Ordner entpacke, den ich zuerst entpacken möchte, und ihn als $ dstName verwende, gibt er eine Warnung aus, dass er die Datei nicht finden kann. Auch wenn ich am Ende des Ziel-Links eine "Datei" mit einem "/" erstellen lasse, gibt es diese Warnung.

Die Verwendung von opendir anstelle von fopen gibt keine Warnung aus, aber es scheint nichts zu extrahieren, dann rate der Handler von einem falschen Typ.

Wie kann ich diese große komprimierte Datei in Teile in einen Ordner entpacken?

Antwort

2

(PK) Zip und GZip sind zwei völlig verschiedene Formate; gzopen kann keine Zip-Archive öffnen.

Um PKZip-Archive zu entpacken, werfen Sie einen Blick auf die PHP Zip extension.

1
<?php 

function unzip($file) { 
    $zip = zip_open($file); 
    if (is_resource($zip)) { 
     $tree = ""; 
     while (($zip_entry = zip_read($zip)) !== false) { 
      echo "Unpacking " . zip_entry_name($zip_entry) . "\n"; 
      if (strpos(zip_entry_name($zip_entry), DIRECTORY_SEPARATOR) !== false) { 
       $last = strrpos(zip_entry_name($zip_entry), DIRECTORY_SEPARATOR); 
       $dir = substr(zip_entry_name($zip_entry), 0, $last); 
       $file = substr(zip_entry_name($zip_entry), strrpos(zip_entry_name($zip_entry), DIRECTORY_SEPARATOR) + 1); 
       if (!is_dir($dir)) { 
        @mkdir($dir, 0755, true) or die("Unable to create $dir\n"); 
       } 
       if (strlen(trim($file)) > 0) { 
        //Downloading in parts 
        $fileSize = zip_entry_filesize($zip_entry); 
        while ($fileSize > 0) { 
         $readSize = min($fileSize, 4096); 
         $fileSize -= $readSize; 
         $content = zip_entry_read($zip_entry, $readSize); 
         if ($content !== false) { 
          $return = @file_put_contents($dir . "/" . $file, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry))); 
          if ($return === false) { 
           die("Unable to write file $dir/$file\n"); 
          } 
         } 
        } 
       } 
       fclose($outFile); 
      } else { 
       file_put_contents($file, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry))); 
      } 
     } 
    } else { 
     echo "Unable to open zip file\n"; 
    } 
} 

unzip($_SERVER['DOCUMENT_ROOT'] . '/test/testing.zip'); 
?>