2014-05-20 12 views
6

Bir dizi HTML, CSS ve görüntü dosyaları oluşturuyorum ve bir zip dosyasına sıkıştırmak için ZipArchive kullanıyorum. Üretilen varlıkların geçerli olduğunu doğruladım, ancak dosya kümesini sıkıştırmaya çalıştığımda, sonuçta ortaya çıkan arşiv dosyası açılamıyor.ZipArchive issue "Hata 21 - Bir Dizin" PHP

PHP'de herhangi bir hata alıyorum ve echo $zip->close() ne zaman döndürdüğümü doğru olarak yazabileceğini ve dosyayı sorunsuz bir şekilde kaydedebildiğini varsayar. Arşivleme Yardımcı Programı ile zip açmak bu hatayı atar:

"Unable to expand "filename.zip" into "Downloads". (Error 21 - Is a directory.)

Burada yanlış olan ne olabilir?

<?php 
$ref = $_SERVER["HTTP_REFERER"]; 
$html = $_REQUEST['html']; 
$images = $_REQUEST['images']; 

$folder = uniqid(); 
$prepped = str_replace($ref.'server/php/files/', 'images/', $html); 

mkdir("./runways/$folder", 0777); 
mkdir("./runways/$folder/images", 0777); 
mkdir("./runways/$folder/css", 0777); 


file_put_contents('./runways/'.$folder.'/index.html',$prepped); 
copy('../../css/runway.css', './runways/'.$folder.'/css/runway.css'); 

foreach($images as $image) { 
    $i = urldecode(str_replace($ref.'server/php/files/', '', $image)); 
    $idata = file_get_contents('./files/'.$i); 
    file_put_contents('./runways/'.$folder.'/images/'.$i, $idata); 

} 

//echo $ref.'server/php/runways/'.$folder.'/'; 

$sourcefolder = './runways/'.$folder.'/'; 
$zipfilename = $folder.'.zip'; 

$dirlist = new RecursiveDirectoryIterator($sourcefolder); 
$filelist = new RecursiveIteratorIterator($dirlist); 

ini_set('max_execution_time', 5000); 
$zip = new ZipArchive(); 

if ($zip->open('./zips/'.$zipfilename, ZIPARCHIVE::CREATE) !== TRUE) { 
    die ("Could not open archive"); 
} 

foreach ($filelist as $key=>$value) { 
    $zip->addFile(realpath($key), $key) or die ("ERROR: Could not add file: $key"); 
} 
$zip->close(); 

echo $ref.'server/php/zips/'.$zipfilename; 

?> 

cevap

0

oluşturduğunuz arşiv dışarı bırakmalısınız Geçerli çalışma dizinleri ve üst dizinleri ("" dosya adları ve "..") içerir:

İşte tüm PHP script. Özgün kodunun oluşturduğu bir arşiv içeriğini görüntülemek Örneğin, böyle bir şey görürsünüz: "./runways/54b69fbd2de29/"

$ unzip -l 54b69fbd2de29.zip 
Archive: 54b69fbd2de29.zip 
    Length  Date Time Name 
-------- ---- ---- ---- 
     0 01-14-15 09:56 ./runways/54b69fbd2de29/. 
     0 01-14-15 09:56 ./runways/54b69fbd2de29/.. 
     0 01-14-15 09:56 ./runways/54b69fbd2de29/css/. 
     0 01-14-15 09:56 ./runways/54b69fbd2de29/css/.. 
     12 01-14-15 09:56 ./runways/54b69fbd2de29/css/runway.css 
     0 01-14-15 09:56 ./runways/54b69fbd2de29/images/. 
     0 01-14-15 09:56 ./runways/54b69fbd2de29/images/.. 
     26 01-14-15 09:56 ./runways/54b69fbd2de29/images/image1.jpg 
     31 01-14-15 09:56 ./runways/54b69fbd2de29/images/image2.jpg 
     6 01-14-15 09:56 ./runways/54b69fbd2de29/index.html 
--------     ------- 
     75     10 files 

Sen istemiyoruz veya "./runways/54b69fbd2de29/ ..", vb. Bunu düzeltmenin bir yolu, son foreach'ı aşağıdaki şekilde değiştirin (ayrıca $ anahtar => $ değer, sadece $ anahtarına ihtiyacınız olmadığını unutmayın):

foreach ($filelist as $key) { 
    if (!preg_match('/\/\.{1,2}$/',$key)){ 
     $zip->addFile(realpath($key), $key) or die ("ERROR: Could not add file: $key"); 
    } 
} 

çıkan arşiv geçerlidir ve şöyle görünür:

unzip -l 54b6a39d55a63.zip 
Archive: 54b6a39d55a63.zip 
    Length  Date Time Name 
-------- ---- ---- ---- 
     12 01-14-15 10:13 ./runways/54b6a39d55a63/css/runway.css 
     26 01-14-15 10:13 ./runways/54b6a39d55a63/images/image1.jpg 
     31 01-14-15 10:13 ./runways/54b6a39d55a63/images/image2.jpg 
     6 01-14-15 10:13 ./runways/54b6a39d55a63/index.html 
--------     ------- 
     75     4 files 
0

biraz ön: Ben silinmelidir benim web sitesi için seçmiş ve bir zip olarak public_html indirdiğiniz dosya. Biraz korktum, sıfırlandıktan sonra web sitemi geri yükleyemedim.

Hızlı bir çözüm (ve benim için çalışanı), App Store'dan The Unarchiver adlı uygulamayı kullanmaktır. Ben cPanel dosya yöneticisi sıkıştırılmış bir dosya kullanırken aynı sorunu vardı ve The Unarchiver düzeltmek için görünüyordu.

İlgili konular