2012-07-12 11 views
5

Estoy comprimiendo carpetas y archivos con php, pero cuando intento abrir el archivo zip obtengo un archivo cpgz. Después de extraer ese archivo, obtengo otro archivo zip. Lo que hace es escanear lentamente la carpeta actual de archivos y carpetas para comprimir. Este es el código que utilizo:Archivo comprimido con resultados PHP en archivo cpgz después de la extracción

function Zip($source, $destination) 
{ 
if (!extension_loaded('zip') || !file_exists($source)) { 
    return false; 
} 

$zip = new ZipArchive(); 
if (!$zip->open($destination, ZIPARCHIVE::CREATE)) { 
    return false; 
} 

$source = str_replace('\\', '/', realpath($source)); 

if (is_dir($source) === true) 
{ 
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); 

    foreach ($files as $file) 
    { 
     $file = str_replace('\\', '/', realpath($file)); 

     if (is_dir($file) === true) 
     { 
      $zip->addEmptyDir(str_replace($source . '/', '', $file . '/')); 
     } 
     else if (is_file($file) === true) 
     { 
      $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file)); 
     } 
    } 
} 
else if (is_file($source) === true) 
{ 
    $zip->addFromString(basename($source), file_get_contents($source)); 
} 

return $zip->close(); 
} 


if($_GET["archive"]== 'true'){ 
$date = date("Ymd_Hi"); 
$dir = dirname(__FILE__); 
$filename = $date.".zip"; 

Zip(getcwd(), $filename); 

header("Content-disposition: attachment; filename=$filename"); 
header('Content-type: application/zip'); 
readfile($filename); 
unlink($filename); 
} 
+0

- @ Steven, ¿su archivo comprimido está en el mismo servidor que el código de su aplicación? He tenido exactamente este mismo problema que [resolví aquí] (http://stackoverflow.com/questions/11495103/opening-downloaded-zip-file-creates-cpgz-file). Además, ¿cómo se ve el 'header() 's'? –

Respuesta

6

Estaba teniendo exactamente el mismo problema, y ​​se enteraron de que estas dos llamadas a funciones pueden ayudar:

header("Content-disposition: attachment; filename=$filename"); 
header('Content-type: application/zip'); 

// Add these 
ob_clean(); 
flush(); 

readfile($filename); 
unlink($filename); 

Por lo general, el establecimiento de Content-Disposition y Content-Length debería ser suficiente, sin embargo, descargar el búfer de salida de PHP y el búfer de salida subyacente (Apache o similar) ayuda cuando la salida se envía accidentalmente antes de que los encabezados se configuren en PHP.

En mi caso, comentar las llamadas a la cabecera() y readfile() para la eliminación de fallas ayudó a ver, que las advertencias se emitieron antes de que se enviara el archivo.

Espero que ayude a alguien en el futuro.

Cuestiones relacionadas