2014-05-20 34 views
6

Generuję zestaw plików HTML, CSS i obrazów i używam ZipArchive, aby skompresować je do pliku zip. Potwierdziłem, że wygenerowane zasoby są prawidłowe, ale gdy próbuję skompresować zestaw plików, wynikowy plik archiwum nie może zostać otwarty.Problem ZipArchive "Błąd 21 - jest katalogiem" w PHP

Nie otrzymuję żadnych błędów w PHP i kiedy I echo $zip->close() zwraca true, co zakładam oznacza, że ​​był w stanie napisać i zapisać plik bez problemu. Otwieranie zamka błyskawicznego za pomocą narzędzia mac Archive Utility powoduje zgłoszenie tego błędu:

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

Co może być nie tak?

Oto cały skrypt PHP:

<?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; 

?> 

Odpowiedz

0

Archiwum tworzysz zawiera aktualne katalogi pracy i katalogi nadrzędne (nazwy plików i „..” „”), które należy pominąć. Na przykład, jeśli przeglądać zawartość archiwum oryginalny kod tworzy, zobaczysz coś takiego: „./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 

nie chcesz lub "./runways/54b69fbd2de29/ ..", itd. Oto jeden sposób, aby to naprawić, zmienić ostateczne foreach na następujące (pamiętaj także, że nie potrzebujesz $ key => $ value, just $ key):

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

Powstały archiwum jest ważny, a wygląda to tak:

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

trochę tło: wybrałem na mojej stronie internetowej należy wytrzeć i Pobrałem public_html jako zip plik. Trochę się bałem, że nie będę mógł przywrócić mojej strony po jej zresetowaniu.

Szybkie rozwiązanie (i to, które działało dla mnie) to użycie aplikacji ze sklepu App Store o nazwie The Unarchiver. Miałem ten sam problem podczas korzystania z pliku skompresowanego z menedżera plików cPanel, a The Unarchiver wydawało się to naprawić.