這裡我採用的是php內建的ZipArchive類
a) 我們只需要new一個ZipArchive對象,然後使用open方法建立一個zip檔案,接著使用addFile方法,將要打包的檔案寫入剛剛建立的zip檔案中,最好還得記得關閉該對象。
b) 注意點:使用open方法的時候,第二個參數$flags是可選的,$flags用來指定對開啟的zip檔案的處理方式,共有四種情況
i.ZIPARCHIVE::OVERWRITE 總是建立一個新的檔案,如果指定的zip檔案存在,則會覆蓋掉
ii. ZIPARCHIVE::CREATE如果指定的zip檔案不存在,則建立一個
iii. ZIPARCHIVE::EXCL 如果指定的zip檔案存在,則會報錯
iv. ZIPARCHIVE::CHECKCONS
一、解壓縮zip檔案
| 代碼如下 |
複製代碼 |
$zip = new ZipArchive;//建立一個ZipArchive的對象 /* 通過ZipArchive的對象處理zip檔案 $zip->open這個方法的參數表示處理的zip檔案名稱。 如果對zip檔案對象操作成功,$zip->open這個方法會返回TRUE */ if ($zip->open('test.zip') === TRUE) { $zip->extractTo('images');//假設解壓縮到在當前路徑下images檔案夾的子檔案夾php $zip->close();//關閉處理的zip檔案 } |
二、將檔案壓縮成zip檔案
| 代碼如下 |
複製代碼 |
$zip = new ZipArchive; /* $zip->open這個方法第一個參數表示處理的zip檔案名稱。 第二個參數表示處理模式,ZipArchive::OVERWRITE表示如果zip檔案存在,就覆蓋掉原來的zip檔案。 如果參數使用ZIPARCHIVE::CREATE,系統就會往原來的zip檔案裡新增內容。 如果不是為了多次新增內容到zip檔案,建議使用ZipArchive::OVERWRITE。 使用這兩個參數,如果zip檔案不存在,系統都會自動建立。 如果對zip檔案對象操作成功,$zip->open這個方法會返回TRUE */ if ($zip->open('test.zip', ZipArchive::OVERWRITE) === TRUE) { $zip->addFile('image.txt');//假設加入的檔案名稱是image.txt,在當前路徑下 $zip->close(); } |
三、檔案追加內容添加到zip檔案
| 代碼如下 |
複製代碼 |
$zip = new ZipArchive; $res = $zip->open('test.zip', ZipArchive::CREATE); if ($res === TRUE) { $zip->addFromString('test.txt', 'file content goes here'); $zip->close(); echo 'ok'; } else { echo 'failed'; } |
例子
執行打包代碼:
| 代碼如下 |
複製代碼 |
import('ORG.Util.FileToZip'); // 打包下載 $cur_file =getcwd().'/dimg/2014052916/'; $handler = opendir($cur_file); //$cur_file 檔案所在目錄 $download_file = array(); $i = 0; while( ($filename = readdir($handler)) !== false ) { if($filename != '.' && $filename != '..') { $download_file[$i++] = $filename; } } closedir($handler); $scandir=new traverseDir($cur_file,$save_path); //$save_path zip包檔案目錄 $scandir->tozip($download_file);
|
FileToZip 類:
| 代碼如下 |
複製代碼 |
<?php /** * 遍曆目錄,打包成zip格式 */ class traverseDir{ public $currentdir;//目前的目錄 public $filename;//檔案名稱 public $fileinfo;//用於儲存目前的目錄下的所有檔案名稱和目錄名以及檔案大小 public $savepath; public function __construct($curpath,$savepath){ $this->currentdir=$curpath;//返回目前的目錄 $this->savepath=$savepath;//返回目前的目錄 } //遍曆目錄 public function scandir($filepath){ if (is_dir($filepath)){ $arr=scandir($filepath); foreach ($arr as $k=>$v){ $this->fileinfo[$v][]=$this->getfilesize($v); } }else { echo "<script>alert('目前的目錄不是有效目錄');</script>"; } } /** * 返迴文件的大小 * * @param string $filename 檔案名稱 * @return 檔案大小(KB) */ public function getfilesize($fname){ return filesize($fname)/1024; } /** * 壓縮檔(zip格式) */ public function tozip($items){ $zip=new ZipArchive(); $zipname=date('YmdHis',time()); if (!file_exists($zipname)){ $zip->open($savepath.$zipname.'.zip',ZipArchive::OVERWRITE);//建立一個空的zip檔案 for ($i=0;$i<count($items);$i++){ $zip->addFile($this->currentdir.'/'.$items[$i],$items[$i]); } $zip->close(); $dw=new download($zipname.'.zip',$savepath); //下載檔案 $dw->getfiles(); unlink($savepath.$zipname.'.zip'); //下載完成後要進行刪除 } } } /** * 下載檔案 * */ class download{ protected $_filename; protected $_filepath; protected $_filesize;//檔案大小 protected $savepath;//檔案大小 public function __construct($filename,$savepath){ $this->_filename=$filename; $this->_filepath=$savepath.$filename; } //擷取檔案名稱 public function getfilename(){ return $this->_filename; } //擷取檔案路徑(包含檔案名稱) public function getfilepath(){ return $this->_filepath; } //擷取檔案大小 public function getfilesize(){ return $this->_filesize=number_format(filesize($this->_filepath)/(1024*1024),2);//去小數點後兩位 } //下載檔案的功能 public function getfiles(){ //檢查檔案是否存在 if (file_exists($this->_filepath)){ //開啟檔案 $file = fopen($this->_filepath,"r"); //返回的檔案類型 Header("Content-type: application/octet-stream"); //按照位元組大小返回 Header("Accept-Ranges: bytes"); //返迴文件的大小 Header("Accept-Length: ".filesize($this->_filepath)); //這裡對用戶端的彈出對話方塊,對應的檔案名稱 Header("Content-Disposition: attachment; filename=".$this->_filename); //修改之前,一次性將資料轉送給用戶端 echo fread($file, filesize($this->_filepath)); //修改之後,一次只傳輸1024個位元組的資料給用戶端 //向用戶端回送資料 $buffer=1024;// //判斷檔案是否讀完 while (!feof($file)) { //將檔案讀入記憶體 $file_data=fread($file,$buffer); //每次向用戶端回送1024個位元組的資料 echo $file_data; } fclose($file); }else { echo "<script>alert('對不起,您要下載的檔案不存在');</script>"; } } } |