使用PHP自帶zlib函式幾行程式碼實現PHP檔案打包下載zip

jefferyjob發表於2016-08-12
<?php
//獲取檔案列表
function list_dir($dir){
    	$result = array();
    	if (is_dir($dir)){
    		$file_dir = scandir($dir);
    		foreach($file_dir as $file){
    			if ($file == `.` || $file == `..`){
    				continue;
    			}
    			elseif (is_dir($dir.$file)){
    				$result = array_merge($result, list_dir($dir.$file.`/`));
    			}
    			else{
    				array_push($result, $dir.$file);
    			}
    		}
    	}
    	return $result;
    }

//獲取列表 
$datalist=list_dir(`../`);
$filename = "./bak.zip"; //最終生成的檔名(含路徑)   
if(!file_exists($filename)){   
//重新生成檔案   
    $zip = new ZipArchive();//使用本類,linux需開啟zlib,windows需取消php_zip.dll前的註釋   
    if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {   
        exit(`無法開啟檔案,或者檔案建立失敗`);
    }   
    foreach( $datalist as $val){   
        if(file_exists($val)){   
            $zip->addFile( $val, basename($val));//第二個引數是放在壓縮包中的檔名稱,如果檔案可能會有重複,就需要注意一下   
        }   
    }   
    $zip->close();//關閉   
}   
if(!file_exists($filename)){   
    exit("無法找到檔案"); //即使建立,仍有可能失敗。。。。   
}   
header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 
header(`Content-disposition: attachment; filename=`.basename($filename)); //檔名   
header("Content-Type: application/zip"); //zip格式的   
header("Content-Transfer-Encoding: binary"); //告訴瀏覽器,這是二進位制檔案    
header(`Content-Length: `. filesize($filename)); //告訴瀏覽器,檔案大小   
@readfile($filename);
?>

PHP ZipArchive是PHP自帶的擴充套件類,可以輕鬆實現ZIP檔案的壓縮和解壓,使用前首先要確保PHP ZIP擴充套件已經開啟,具體開啟方法這裡就不說了,不同的平臺開啟PHP擴增的方法網上都有,如有疑問歡迎交流。這裡整理一下利用php zipArchive進行檔案的壓縮與解壓縮的常用的示例供參考。


一、解壓縮zip檔案

$zip=new ZipArchive;//新建一個ZipArchive的物件
	if($zip->open(`test.zip`)===TRUE){
	$zip->extractTo(`images`);//假設解壓縮到在當前路徑下images資料夾內
	$zip->close();//關閉處理的zip檔案
}

二、將檔案壓縮成zip檔案

$zip=new ZipArchive;
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`;
}

四、將資料夾打包成zip檔案

function addFileToZip($path,$zip){
	$handler=opendir($path); //開啟當前資料夾由$path指定。
	while(($filename=readdir($handler))!==false){
		if($filename != "." && $filename != ".."){//資料夾檔名字為`.`和‘..’,不要對他們進行操作
			if(is_dir($path."/".$filename)){// 如果讀取的某個物件是資料夾,則遞迴
				addFileToZip($path."/".$filename, $zip);
			}else{ //將檔案加入zip物件
				$zip->addFile($path."/".$filename);
			}
		}
	}
	@closedir($path);
}
$zip=new ZipArchive();
if($zip->open(`images.zip`, ZipArchive::OVERWRITE)=== TRUE){
	addFileToZip(`images/`, $zip); //呼叫方法,對要打包的根目錄進行操作,並將ZipArchive的物件傳遞給方法
	$zip->close(); //關閉處理的zip檔案
}

下載Zip的類檔案

<?php
/**
 * 檔案壓縮ZIP下載
 */
class CreateExcel{

	public $filename;
	public $filePath;

	public function __construct()
	{
		set_time_limit(0);
	}

	/**
	 * 壓縮生成ZIP
	 *
	 * @Params String $filename 檔名稱
	 * @Params Array $filePath 檔案路徑(一維陣列)
	 */
	public function create($filename, $filePath)
	{
		$filename = $filename.".zip";
		$this->filename = $filename;
		$this->filePath = $filePath;
		$this->Zip();
		if(!file_exists($filename))
		{
			return false;die;//即使建立,仍有可能失敗。。。。   
		}
		header("Cache-Control: public"); 
		header("Content-Description: File Transfer"); 
		header(`Content-disposition: attachment; filename=`.basename($filename)); //檔名   
		header("Content-Type: application/zip"); //zip格式的   
		header("Content-Transfer-Encoding: binary"); //告訴瀏覽器,這是二進位制檔案    
		header(`Content-Length: `. filesize($filename)); //告訴瀏覽器,檔案大小   
		@readfile($filename);
		@unlink($filename); //刪除檔案
	}

	/**
	 * 壓縮生成Zip檔案
	 */
	public function Zip()
	{
		$filename = $this->filename;
		$filePath = $this->filePath;
		if(!file_exists($filename))
		{   
			//重新生成檔案   
			$zip = new ZipArchive();//使用本類,linux需開啟zlib,windows需取消php_zip.dll前的註釋   
			if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) 
			{   
				exit(`無法開啟檔案,或者檔案建立失敗`);
			}   
			foreach( $filePath as $val)
			{   
				if(file_exists($val))
				{ 
					$zip->addFile( $val, basename($val));//第二個引數是放在壓縮包中的檔名稱,如果檔案可能會有重複,就需要注意一下   
				}   
			}   
			$zip->close();//關閉   
		}
	}



}



相關文章