微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ZipArchive问题“错误21 – 是一个目录”在PHP中

我正在生成一组 HTML,CSS和图像文件,我正在使用ZipArchive将它们压缩成zip文件.我已经确认生成的资产是有效的,但是当我尝试压缩文件集时,无法打开生成的存档文件.

我没有在PHP中出现任何错误,当我回显$zip-> close()时,它返回true,我认为这意味着它能够写入并保存文件而不会出现问题.使用mac Archive Utility打开zip会引发此错误

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

?>
您正在创建的存档包括当前工作目录和父目录(文件名“.”和“..”),您应该忽略它们.例如,如果您查看原始代码创建的存档的内容,您将看到如下内容
$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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐