2012-11-30 2 views
2

에 의해 생성 된 Windows 탐색기에서 열 수 없습니다 zip 파일은 Windows가 폴더를 열 수 없습니다 "은 수 있습니까 PHP 우편 아카이브에 의해 생성되는 내 zip 파일을 열려고 할 때 PHP 우편 아카이브

보여주는 경고가있다. 압축 된 (압축 된) 폴더 'filename'이 (가) 유효하지 않습니다. " Windows 탐색기에서 여는 중 오류가 발생했습니다.

하지만 7-zip으로 파일을 열 수 있습니다. 어떤 이유로 Windows 탐색기에서 zip 파일을 열 수 있는지 확인해야합니다. zip 파일을 생성 할 때 문제가 있습니까? 도와주세요! 당신이 우편에 추가 할 파일, 당신은 파일 경로를 포함해야하므로 같은 디렉토리에 PHP 스크립트가 없다면

$zip->addFile($file,$file); 

:

function create_a_zip($files = array(),$dest = '',$root_folder,$overwrite = false) { 
     if(file_exists($dest) && !$overwrite) { 
      return false; 
     } 
     $valid_files = array(); 
     if(is_array($files)) { 
      foreach($files as $file) { 
       if(file_exists($file)) { 
        $valid_files[] = $file; 
       } 
      } 
     } 

     if(count($valid_files)) { 
      $zip = new ZipArchive(); 
      if($zip->open($dest,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { 
       return false; 
      } 
      foreach($valid_files as $valid_file) { 
       if(is_dir($valid_file) === true){ 
        foreach(glob($valid_file . '/*') as $file){ 
         $zip->addFile($file, $root_folder . $file); 
        } 

       }else if (is_file($valid_file) === true){ 
        $zip->addFile($valid_file, $root_folder . $valid_file); 
       } 
      } 
      $zip->close(); 

      return file_exists($dest); 
     } 
     else 
     { 
      return false; 
     } 
    } 

답변

1

나는 문제가에서 유래 생각합니다. addFile의 두 번째 매개 변수는 zip 파일의 이름이므로 $ file var에 경로가 포함되어 있으면 문제가 발생한 것입니다.

$filenameonly = preg_replace("/(.*)\/?([^\/]+)/","$2",$file); 
$zip->addFile($file,$filenameonly); 

파일 경로를 제거 할 (있는 경우) 및 addFile에서 두번째 변수에 당신에게 파일 이름 만 남겨 :에 코드를 변경하려고합니다.

이 방법으로 문제가 해결되면 파일 이름에 문제가 있는지 쉽게 알 수 있습니다.

+0

제안 해 주셔서 감사합니다. 그러나 알파벳, 숫자, 점 (.) 및 밑줄 (_) 만 사용합니다. 따라서 경로에 공백이 없습니다. – Ywis

+0

영어 이외의 문자는 어떻게됩니까? – Flot2011

+0

추적 코드를 마친 후 마침내 경로 이름이 문제가 아님을 알게되었습니다. 서버에 생성 된 zip 파일은 ** correct **입니다 (Windows의 내장 Zip 유틸리티로 열 수 있음). 다운로드 zip 파일은 ** 잘못된 **입니다! 파일 전송시 문제가 있습니까? 나는 그들의 파일 크기를 비교했다, 그들은 똑같다. ...... 어쨌든, 당신의 친절한 도움에 여전히 감사해야한다! – Ywis

0

예를 들어 $abspath과 같이 절대 경로에 매개 변수로 보내면됩니다. 그런 다음 사용하십시오

$filenameonly = str_replace($abspath,"",$file); 
$zip->addFile($file, $filenameonly); 

윈도우 8에서도 100 % 작동하며 심지어 압축 파일도 폴더에 있습니다.

0

str_replace 문자열 함수를 사용하는 대신 기본 제공 파일 시스템 함수를 사용할 수 있습니다.

나를 위해
$zip->addFile(realpath($file), pathinfo($file, PATHINFO_BASENAME)); 
3

솔루션은 그렇게하지 않더라도 ... (코멘트에 @Ywis에 의해 언급 된 바와 같이) zip 파일의 내용을 출력하기 전에

ob_end_clean(); 
readfile($zipfilename); // outputs zip file's content 

ob_end_clean()를 사용하는 것이 었습니다 그 전에 모든 문자를 출력하십시오.