我正在生成一组
HTML,CSS和图像文件,我正在使用ZipArchive将它们压缩成zip文件.我已经确认生成的资产是有效的,但是当我尝试压缩文件集时,无法打开生成的存档文件.
我没有在@L_301_1@中出现任何错误,当我回显$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; ?>
您正在创建的存档包括当前工作目录和父目录(文件名“.”和“..”),您应该忽略它们.例如,如果您查看原始代码创建的存档的内容,您将看到如下内容:
原文链接:/php/136353.html$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