2010-10-22 20 views
43

(o gelmez ki - bu sayfadan alınan - http://davidwalsh.name/create-zip-php) ancak zip dosyası içinde, klasör isimleri tümüne vardır dosyanın kendisi. php Ben bir zip dosyası oluşturmak için php kullanmak çalışıyorum

sadece zip eksi tüm klasörlerin içindeki dosyayı olabilir mi?

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

'-D' anahtarı (büyük harf!) Deneyin – drudge

cevap

107

Buradaki sorun $zip->addFile aynı iki parametre geçirilen olmasıdır:

İşte benim kod. the documentation göre

:

bool ZipArchive :: addFile (string $ dosya [, string $ localName])

dosya
dosyasının yolunu eklemek. ZIP arşivi içinde yerel ad (10).

Bu ilk parametre dosya sistemindeki fiili dosyanın yoludur ve ikinci dosya arşivde olacak yol & dosya olduğu anlamına gelir. Eğer ikinci parametre tedarik zaman

, zip arşive eklerken ondan yolunu şerit isteyeceksiniz. Daha iyi bir seçenek olacağını düşünüyorum

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

sayesinde çok :) benim için çalıştı bulundu sadece başka yöntemdir – SoulieBaby

+0

Garip bu özdeş sorun iki kez kadar kırpılmış ettiğini iki gün ... http://stackoverflow.com/questions/3988496/how-to-add-a-txt-file-and-create-a-zip-in-php/3989210#3989210 –

+0

popüler soru LOL? garip. – SoulieBaby

33

: basitçe yolundan dosya adı ayıklar

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

gibi Örneğin, Unix tabanlı sistemlerde bu görünürdü.

+1

Mükemmel cevap - çekicilik gibi çalışır! – Hexodus

+0

Yerleşik PHP [basename] (http://php.net/manual/en/function.basename.php) işlevi olduğunu bilmiyordum –

0

Bu Bunun

$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); 
İlgili konular