2010-10-22 14 views
43

Sto cercando di utilizzare php per creare un file zip (che lo fa - preso da questa pagina - http://davidwalsh.name/create-zip-php), tuttavia all'interno del file zip ci sono tutti i nomi delle cartelle in il file stesso.php creazione di zip senza percorso per i file all'interno del zip

E 'possibile avere solo il file all'interno dello zip meno tutte le cartelle?

Ecco il mio codice:

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

provare l'interruttore -D' (maiuscolo!) ' – drudge

risposta

107

Il problema qui è che $zip->addFile viene passato gli stessi due parametri.

Secondo the documentation:

bool ZipArchive :: addfile (string $ filename [, string $ localName])

nome
Il percorso del file aggiungere.

localname
nome locale all'interno archivio ZIP.

Ciò significa che il primo parametro è il percorso del file vero e proprio nel filesystem e il secondo è il percorso & nome del file che il file avrà nell'archivio.

Quando si fornisce il secondo parametro, è necessario rimuovere il percorso da esso quando lo si aggiunge all'archivio zip. Per esempio, su sistemi basati su Unix questo sarebbe simile:

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

thanks so much :) – SoulieBaby

+0

Strano che questo problema identico è ritagliata due volte in due giorni ... http://stackoverflow.com/questions/3988496/how-to-add-a-txt-file-and-create-a-zip-in-php/3989210#3989210 –

+0

LOL domanda frequente? strano. – SoulieBaby

33

Credo che una soluzione migliore sarebbe:

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

che estrae semplicemente il nome del file dal percorso.

+1

Risposta perfetta: funziona come un incantesimo! – Hexodus

+0

Non sapevo che esistesse una funzione PHP [basename] (http://php.net/manual/en/function.basename.php) integrata –

0

Questo è solo un altro metodo che ho trovato che ha funzionato per me

$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); 
Problemi correlati