2014-05-20 13 views
6

Sto generando un insieme di file HTML, CSS e di immagini e sto utilizzando ZipArchive per comprimerli in un file zip. Ho confermato che gli asset generati sono validi, ma quando tento di comprimere il set di file, il file di archivio risultante non può essere aperto.Problema di ZipArchive "Errore 21 - È una directory" in PHP

Non ricevo alcun errore nel PHP e quando I echo $zip->close() restituisce true che presumo significhi che è stato in grado di scrivere e salvare il file senza problemi. L'apertura del file zip con l'utilità di archiviazione mac genera questo errore:

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

Cosa potrebbe esserci di sbagliato?

Qui è l'intero script 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; 

?> 

risposta

0

L'archivio si sta creando include directory corrente di lavoro e le directory superiori (nomi di file e ".." ""), che si dovrebbe lasciare fuori. Per esempio, se si visualizza il contenuto di un archivio del codice originale crea, vedrete qualcosa di simile:

$ 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 

Tu non vuoi "./runways/54b69fbd2de29/." o "./runways/54b69fbd2de29/ ..", ecc. Ecco un modo per risolvere il problema, cambiare il foreach finale al seguente (si noti anche che non è necessario $ key => $ value, solo $ key):

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

L'archivio risultante è valida, e si presenta così:

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

un po 'di storia: ho scelto per il mio sito web per essere spazzato via, e ho scaricato public_html come una zip file. Ero un po 'spaventato non sarei in grado di ripristinare il mio sito Web una volta che è stato ripristinato.

Una soluzione rapida (e quella che ha funzionato per me) consiste nell'utilizzare un'app dall'App Store chiamato The Unarchiver. Ho avuto questo stesso problema quando si utilizzava un file compresso dal gestore file cPanel e The Unarchiver sembrava risolvere il problema.

Problemi correlati