2010-08-30 15 views

Respuesta

5

Use zip_open y zip_read funciones para hacerlo. documentación a que se pueden encontrar en http://pl2.php.net/manual/en/function.zip-read.php

<?php 
/** 
* This method unzips a directory within a zip-archive 
* 
* @author Florian 'x!sign.dll' Wolf 
* @license LGPL v2 or later 
* @link http://www.xsigndll.de 
* @link http://www.clansuite.com 
*/ 

function extractZip($zipFile = '', $dirFromZip = '') 
{ 
    define(DIRECTORY_SEPARATOR, '/'); 

    $zipDir = getcwd() . DIRECTORY_SEPARATOR; 
    $zip = zip_open($zipDir.$zipFile); 

    if ($zip) 
    { 
     while ($zip_entry = zip_read($zip)) 
     { 
      $completePath = $zipDir . dirname(zip_entry_name($zip_entry)); 
      $completeName = $zipDir . zip_entry_name($zip_entry); 

      // Walk through path to create non existing directories 
      // This won't apply to empty directories ! They are created further below 
      if(!file_exists($completePath) && preg_match('#^' . $dirFromZip .'.*#', dirname(zip_entry_name($zip_entry)))) 
      { 
       $tmp = ''; 
       foreach(explode('/',$completePath) AS $k) 
       { 
        $tmp .= $k.'/'; 
        if(!file_exists($tmp)) 
        { 
         @mkdir($tmp, 0777); 
        } 
       } 
      } 

      if (zip_entry_open($zip, $zip_entry, "r")) 
      { 
       if(preg_match('#^' . $dirFromZip .'.*#', dirname(zip_entry_name($zip_entry)))) 
       { 
        if ($fd = @fopen($completeName, 'w+')) 
        { 
         fwrite($fd, zip_entry_read($zip_entry, zip_entry_filesize($zip_entry))); 
         fclose($fd); 
        } 
        else 
        { 
         // We think this was an empty directory 
         mkdir($completeName, 0777); 
        } 
        zip_entry_close($zip_entry); 
       } 
      } 
     } 
     zip_close($zip); 
    } 
    return true; 
} 

// The call to exctract a path within the zip file 
extractZip('clansuite.zip', 'core/filters'); 
?> 
+0

'if ($ zip)' no funciona, se debe utilizar si '(is_resource ($ zip))'. Ver ['zip_open'] (http://php.net/manual/fr/function.zip-open.php). Además, el enlace proporcionado en la respuesta ya no está disponible. – kjaquier

0

zip:// El protocolo es proporcionada por el ZIP extension de PHP. Verifique en su salida phpinfo() si la extensión ha sido instalada o no.

+0

de phpinfo(): Zip => Activado Versión Extensión => $ Id: php_zip.c, v 1.1.2.38 08/06/2007 22:02:32 bjori Exp $ versión Zip => 2.0. 0 Versión Libzip => 0.7.1 Corrientes PHP registradas => zip, php, archivo, datos, http, ftp, compress.bzip2, compress.zlib, https, ftps – Sam

+0

¿Ha comprobado si el archivo que intenta abrir es en realidad un archivo '.zip' válido? – joschi

+0

%> archivo test.zip test.zip: datos de archivo Zip, al menos v2.0 para extraer – Sam

0

uso ZipArchive clase

$zip = new ZipArchive; 
$zip->open('test.zip'); 
echo $zip->getFromName('filename.txt'); 
$zip->close(); 
Cuestiones relacionadas