2014-05-20 51 views
6

中的“错误21 - 是目录”我正在生成一组HTML,CSS和图像文件,并且我正在使用ZipArchive将它们压缩成一个zip文件。我已确认生成的资产是有效的,但是当我尝试压缩文件集时,生成的存档文件无法打开。ZipArchive问题PHP

我没有收到任何错误在PHP中,当我echo $zip->close()它返回true,我假设它能够写入并保存文件没有问题。使用mac归档实用程序打开邮编引发此错误:

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

这里可能有什么问题?

这里是整个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; 

?> 

回答

0

要创建的存档包含当前工作目录和父目录(文件名和“..”“”),你应该离开了。例如,如果你看到原始代码创建了一个存档文件的内容,你会看到这样的事情:

$ 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 

你不想“./runways/54b69fbd2de29/。”或“./runways/54b69fbd2de29/ ..”等。这里有一种方法可以解决这个问题,将最终的foreach改为以下(注意你不需要$ key => $ value,只需$ key):

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

生成的存档是有效的,而且看起来是这样的:

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

一点背景:我选择,我的网站被消灭了,我已经下载的public_html作为一个zip文件。我有点害怕,一旦它被重置,我将无法恢复我的网站。

一个快速解决方案(以及为我工作的解决方案)是使用来自App Store的名为The Unarchiver的应用程序。使用从cPanel文件管理器压缩的文件时,我遇到了同样的问题,并且The Unarchiver似乎解决了这个问题。