2012-07-09 114 views
1

我需要unziping上傳的內容。但出於安全考慮,必須驗證文件是否只是圖像文件,以便有人不能將zip添加到zip中,然後再運行它。php zipArchive只解壓縮某些擴展

在進行解壓縮時,我需要預先保存文件結構。

$zip->extractTo($save_path . $file_name, array('*.jpg','*.jpeg','*.png','*.gif')); 

不返回null。是否有一個參數我可以用於此,或者我必須使用正則表達式來循環遍歷zip文件以匹配擴展名並創建文件夾並用代碼保存文件?

感謝

+0

不要以爲您可以使用* .jpg來包含擴展名。你需要解析每個文件。 – Ciro 2012-07-09 01:05:44

回答

2

的人誰需要這在將來這裏是我的解決方案。感謝Ciro的這篇文章,我只需要擴展你的一些。爲了確保所有文件夾都已創建,我首先爲文件夾循環,然後執行沉澱。

$ZipFileName = dirname(__FILE__)."/test.zip"; 
$home_folder = dirname(__FILE__)."/unziped"; 

mkdir($home_folder); 

$zip = new ZipArchive; 
if ($zip->open($ZipFileName) === true) 
{ 

    //make all the folders 
    for($i = 0; $i < $zip->numFiles; $i++) 
    { 
     $OnlyFileName = $zip->getNameIndex($i); 
     $FullFileName = $zip->statIndex($i);  
     if ($FullFileName['name'][strlen($FullFileName['name'])-1] =="/") 
     { 
      @mkdir($home_folder."/".$FullFileName['name'],0700,true); 
     } 
    } 

    //unzip into the folders 
    for($i = 0; $i < $zip->numFiles; $i++) 
    { 
     $OnlyFileName = $zip->getNameIndex($i); 
     $FullFileName = $zip->statIndex($i);  

     if (!($FullFileName['name'][strlen($FullFileName['name'])-1] =="/")) 
     { 
      if (preg_match('#\.(jpg|jpeg|gif|png)$#i', $OnlyFileName)) 
      { 
       copy('zip://'. $ZipFileName .'#'. $OnlyFileName , $home_folder."/".$FullFileName['name']); 
      } 
     } 
    } 
    $zip->close(); 
} else 
{ 
    echo "Error: Can't open zip file"; 
} 
3

php.net,處理.txt文件

<?php 
    $value="test.zip"; 
    $filename="zip_files/$value"; 
    $zip = new ZipArchive; 
    if ($zip->open($filename) === true) { 
     echo "Generating TEXT file."; 
      for($i = 0; $i < $zip->numFiles; $i++) { 
      $entry = $zip->getNameIndex($i); 
       if(preg_match('#\.(txt)$#i', $entry)) 
       { 
       ////This copy function will move the entry to the root of "txt_files" without creating any sub-folders unlike "ZIP->EXTRACTO" function. 
       copy('zip://'.dirname(__FILE__).'/zip_files/'.$value.'#'.$entry, 'txt_files/'.$value.'.txt'); 
       } 
       } 
      $zip->close(); 
      } 
    else{ 
     echo "ZIP archive failed"; 
     } 
?>