2012-11-30 42 views
2

当我试图打开它是由PHP Zip文件生成我的zip文件生成在Windows资源管理器无法打开zip文件,有证据显示能否它通过PHP Zip文件

“Windows无法打开该文件夹警报。压缩(压缩)文件夹 “文件名”无效。“ Windows资源管理器中打开错误。

但我可以通过7-zip打开文件。出于某种原因,我必须确保Windows资源管理器可以打开zip文件。当我生成zip文件时是否有任何问题?请帮忙!

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

我觉得从这个问题来源:

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

除非你有在同一目录下你的PHP脚本,只要你想添加到压缩文件,您将需要包括的文件路径。 addFile中的第二个参数是zip内部文件的名称,因此如果$ file var包含路径,那么问题可能来自哪里。尝试将代码更改为:

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

将剥离出的文件路径(如果有的话),让你只有文件名中addFile第二个变量。

如果这能解决您的问题,您将确定知道问题出在您的文件名中,并且可以轻松找到它。

+0

感谢您的建议。但是,我只使用字母,数字,点(。)和下划线(_)的路径。所以路线上没有空白。 – Ywis

+0

非英文字符怎么样? – Flot2011

+0

经过几小时的追踪代码,最后我发现路径名不是问题。在服务器上生成的zip文件是**正确**(可以通过Windows的内置Zip实用程序打开),而下载zip文件**不正确**!文件传输有问题吗?我比较了他们的文件大小,他们完全一样......无论如何,还是要感谢你的亲切帮助! – Ywis

0

仅作为参数发送到绝对路径,例如$abspath。然后使用它在

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

即使在Windows 8甚至你的zip文件都在文件夹中它工作100%。

0

除了使用str_replace字符串函数外,还可以使用内置的文件系统函数。

$zip->addFile(realpath($file), pathinfo($file, PATHINFO_BASENAME)); 
3

对我来说,解决办法是输出的zip文件的内容(如通过@Ywis在评论中指出的)前使用ob_end_clean() ...

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

...即使你不在此之前输出任何字符。