php ZipArchive打包壓縮zip檔案執行個體

來源:互聯網
上載者:User

這裡我採用的是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>";
 }
 }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.