2010-10-22 18 views
43

Estoy tratando de usar php para crear un archivo zip (que lo hace - tomado de esta página - http://davidwalsh.name/create-zip-php), sin embargo dentro del archivo zip están todos los nombres de las carpetas el archivo en síphp crear cremalleras sin ruta de acceso a los archivos dentro del zip

¿Es posible tener el archivo dentro del archivo zip sin todas las carpetas?

Aquí está mi código:

function create_zip($files = array(), $destination = '', $overwrite = true) { 

    if(file_exists($destination) && !$overwrite) { return false; }; 
    $valid_files = array(); 
    if(is_array($files)) { 
     foreach($files as $file) { 
      if(file_exists($file)) { 
       $valid_files[] = $file; 
      }; 
     }; 
    }; 
    if(count($valid_files)) { 
     $zip = new ZipArchive(); 
     if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { 
      return false; 
     }; 
     foreach($valid_files as $file) { 
      $zip->addFile($file,$file); 
     }; 
     $zip->close(); 
     return file_exists($destination); 
    } else { 
     return false; 
    }; 

}; 


$files_to_zip = array('/media/138/file_01.jpg','/media/138/file_01.jpg','/media/138/file_01.jpg'); 

$result = create_zip($files_to_zip,'/...full_site_path.../downloads/138/138_files.zip'); 
+1

probar el interruptor de '-D' (mayúsculas!) – drudge

Respuesta

107

El problema aquí es que se está pasando $zip->addFile los mismos dos parámetros.

Según the documentation:

ZipArchive bool :: addFile (cadena $ archivo [, string $ nombre_local])

nombre
La ruta al archivo para agregar

nombre local
nombre local dentro de archivo ZIP archivo.

Esto significa que el primer parámetro es la ruta de acceso al archivo real en el sistema de archivos y el segundo es el camino & nombre de archivo que el archivo tendrá en el archivo.

Cuando proporcione el segundo parámetro, querrá quitarle la ruta al agregarlo al archivo zip. Por ejemplo, en sistemas basados ​​en Unix esto se vería así:

$new_filename = substr($file,strrpos($file,'/') + 1); 
$zip->addFile($file,$new_filename); 
+0

muchas gracias :) – SoulieBaby

+0

extraño que este mismo problema ha surgido en dos ocasiones dos días ... http://stackoverflow.com/questions/3988496/how-to-add-a-txt-file-and-create-a-zip-in-php/3989210#3989210 –

+0

LOL pregunta popular? extraño. – SoulieBaby

33

Creo que una mejor opción sería:

$zip->addFile($file,basename($file)); 

que simplemente se extrae el nombre del archivo de la ruta.

+1

¡Respuesta perfecta - funciona como un encanto! – Hexodus

+0

No sabía que había una función incorporada de PHP [basename] (http://php.net/manual/en/function.basename.php) –

0

Este es sólo otro método que he encontrado que trabajó para mí

$zipname = 'file.zip'; 
$zip = new ZipArchive(); 
$tmp_file = tempnam('.',''); 
$zip->open($tmp_file, ZipArchive::CREATE); 
$download_file = file_get_contents($file); 
$zip->addFromString(basename($file),$download_file); 
$zip->close(); 
header('Content-disposition: attachment; filename='.$zipname); 
header('Content-type: application/zip'); 
readfile($tmp_file); 
Cuestiones relacionadas