使用PHP自帶zlib函式 幾行程式碼實現PHP檔案打包下載zip
阿新 • • 發佈:2019-01-11
<?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檔案$zip=new ZipArchive;//新建一個ZipArchive的物件 if($zip->open('test.zip')===TRUE){ $zip->extractTo('images');//假設解壓縮到在當前路徑下images資料夾內 $zip->close();//關閉處理的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();//關閉
}
}
}