2014-05-20 4 views
6

나는 HTML, CSS 및 이미지 파일을 생성 중이며 ZipArchive를 사용하여 압축 파일로 압축합니다. 생성 된 자산이 유효하다는 것을 확인했지만 일련의 파일을 압축하려고하면 결과 아카이브 파일을 열 수 없습니다.ZipArchive 발행물 "PHP 파일에서 21 번째 오류"

PHP에서 오류가 발생하지 않으며 echo $zip->close()이 true로 표시되면 문제없이 파일에 쓰고 저장할 수 있다고 가정합니다.

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

여기에 무엇이 잘못 될 수 있습니다 맥과 지퍼를 열면 아카이브 유틸리티이 오류가 발생합니다?

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

당신이 만드는 아카이브는 생략한다 현재 작업 디렉토리와 부모 디렉토리 ("."파일 이름과 "..")이 포함

다음은 전체 PHP 스크립트입니다. 원래 코드가 생성하는 아카이브의 내용을 볼 예를 들어, 당신은 다음과 같이 나타납니다 : ". ./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 

원하지 않는를 또는 "./runways/54b69fbd2de29/ .."등이 있습니다.이 문제를 해결하는 한 가지 방법이 있습니다. 마지막 foreach를 다음과 같이 변경하십시오 ($ 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을 다운로드 파일. 나는 다시 한 번 내 웹 사이트를 복원 할 수 없을 것이라고 두려워했다.

앱 스토어에서 The Unarchiver이라는 앱을 사용하는 것이 가장 빠른 해결책입니다. cPanel 파일 관리자에서 압축 된 파일을 사용할 때도 동일한 문제가 발생했으며 The Unarchiver이이를 수정 한 것으로 보입니다.