2015-06-23 3 views
2

Я использую следующий код в PHP, чтобы сжать папку и загрузить все свои файлы:Исключить скрытые файлы из Zip загрузки в PHP

<?php 

$the_folder = '/path/to/folder/to/be/zipped'; 
$zip_file_name = '/path/to/zip/archive.zip'; 

$download_file= true; 
$delete_file_after_download= true; 

class FlxZipArchive extends ZipArchive { 
    /** Add a Dir with Files and Subdirs to the archive;;;;; @param string $location Real Location;;;; @param string $name Name in Archive;;; @author Nicolas Heimann;;;; @access private **/ 

    public function addDir($location, $name) { 
     $this->addEmptyDir($name); 

     $this->addDirDo($location, $name); 
    } // EO addDir; 

    /** Add Files & Dirs to archive;;;; @param string $location Real Location; @param string $name Name in Archive;;;;;; @author Nicolas Heimann 
    * @access private **/ 
    private function addDirDo($location, $name) { 
     $name .= '/'; 
     $location .= '/'; 

     // Read all Files in Dir 
     $dir = opendir ($location); 
     while ($file = readdir($dir)) 
     { 
      if ($file == '.' || $file == '..') continue; 

      // Rekursiv, If dir: FlxZipArchive::addDir(), else ::File(); 
      $do = (filetype($location . $file) == 'dir') ? 'addDir' : 'addFile'; 
      $this->$do($location . $file, $name . $file); 
     } 
    } // EO addDirDo(); 
} 
$za = new FlxZipArchive; 
$res = $za->open($zip_file_name, ZipArchive::CREATE); 
$basename = pathinfo($zip_file_name, PATHINFO_BASENAME); 
if($res === TRUE) 
{ 
    $za->addDir($the_folder,basename($the_folder)); 
    $za->close(); 
} 
else { echo 'Could not create a zip archive';} 

if ($download_file) 
{ 
    ob_get_clean(); 
    header("Pragma: public"); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private", false); 
    header("Content-Type: application/zip"); 
    header("Content-Disposition: attachment; filename=\"$basename\""); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: " . filesize($zip_file_name)); 
    readfile($zip_file_name); 
} 
?> 

Где следует условию быть добавлено, чтобы пропустить скрытые файлы и папки? Я использую следующую функцию, чтобы проверить, если файл/папка скрыта или нет:

function is_hidden_file($path) { 

    $dir = "\"".$path."\""; 
    $attr = trim(shell_exec("FOR %A IN (".$dir.") DO @ECHO %~aA")); 
    if($attr[3] === 'h') 
     return true; 

    return false; 
} 

ответ

2

Это решение, которое я узнал, так, чтобы пропустить Фактические скрытые файлы и другие файлы, начинающиеся с «» и '~' от копирования и загрузки. Он отлично работает с окнами 7, окном 8 и окнами 8.1.

<?php 

    $the_folder = '/path/to/folder/to/be/zipped'; 
    $zip_file_name = '/path/to/archive.zip'; 

    $download_file= true; 
    $delete_file_after_download= true; 

    class FlxZipArchive extends ZipArchive { 
     /** Add a Dir with Files and Subdirs to the archive;;;;; @param string $location Real Location;;;; @param string $name Name in Archive;;; @author Nicolas Heimann;;;; @access private **/ 

     public function addDir($location, $name) { 

      $this->addEmptyDir($name); 

      $this->addDirDo($location, $name); 
     } // EO addDir; 

     /** Add Files & Dirs to archive;;;; @param string $location Real Location; @param string $name Name in Archive;;;;;; @author Nicolas Heimann 
     * @access private **/ 
     private function addDirDo($location, $name) { 
      $name .= '/'; 
      $location .= '/'; 

      // Read all Files in Dir 
      $dir = opendir ($location); 
      while ($file = readdir($dir)) 
      { 
       /************Putting the condition here restricts hidden files and files starting with '.' and '~'...***********************/ 
       if ($file == '.' || $file == '..' || $file[0]=='.' || $file[0]=='~' || is_hidden_file($location.$file)) continue; 


       // Rekursiv, If dir: FlxZipArchive::addDir(), else ::File(); 
       $do = (filetype($location . $file) == 'dir') ? 'addDir' : 'addFile'; 
       $this->$do($location . $file, $name . $file); 
      } 
     } // EO addDirDo(); 
    } 

    function is_hidden_file($fn) { 

     $dir = "\"".$fn."\""; 
     $attr = trim(shell_exec("FOR %A IN (".$dir.") DO @ECHO %~aA")); 
     if($attr[3] === 'h') 
      return true; 

     return false; 
    } 

    $za = new FlxZipArchive; 
    $res = $za->open($zip_file_name, ZipArchive::CREATE); 
    $basename = pathinfo($zip_file_name, PATHINFO_BASENAME); 

    if($res === TRUE) 
    { 
     $za->addDir($the_folder,basename($the_folder)); 
     $za->close(); 
    } 
    else { echo 'Could not create a zip archive';} 

    if ($download_file){ 
    ob_get_clean(); 
    header("Pragma: public"); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private", false); 
    header("Content-Type: application/zip"); 
    header("Content-Disposition: attachment; filename=".basename($zip_file_name) . ";"); 
    header("Content-Transfer-Encoding: binary"); 
    header("Content-Length: " . filesize($zip_file_name)); 
     if($delete_file_after_download){ 
      ob_clean(); 
      flush(); 
      if (readfile($zip_file_name)) 
       unlink($zip_file_name); 
     }else{ 
      readfile($zip_file_name); 
     } 
    } 
    ?> 
2

Hi только одна деталь здесь.

Если вы хотите удалить файл после скачанной необходимости в обновленной последнюю часть кода с этим:

if ($download_file){ 
     ob_get_clean(); 
     header("Pragma: public"); 
     header("Expires: 0"); 
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
     header("Cache-Control: private", false); 
     header("Content-Type: application/zip"); 
     header("Content-Disposition: attachment; filename=".basename($zip_file_name) . ";"); 
     header("Content-Transfer-Encoding: binary"); 
     header("Content-Length: " . filesize($zip_file_name)); 
     if($delete_file_after_download){ 
      ob_clean(); 
      flush(); 
      if (readfile($zip_file_name)) 
       unlink($zip_file_name); 
     }else{ 
      readfile($zip_file_name); 
     } 
    } 
+0

Спасибо за замечать недостаток там :) –