php文件打包 下載之使用PHP自帶的ZipArchive壓縮文件并下載打包好的文件
Jun 13, 2016 am 11:59 AM
總結(jié):
使用PHP下載文件的操作需要給出四個(gè)header(),可以參考我的另一篇博文:PHP如何實(shí)現(xiàn)下載功能超詳細(xì)流程分析
計(jì)算文件的大小的時(shí)候,并不需要先打開文件,通過filesize($filename)就可以看出,如果需要先打開文件的話,filesize可能就會(huì)是這樣的形式了filesize($filehandle)
向客戶端回送數(shù)據(jù)的是,記得要設(shè)置一個(gè)buffer,用來指定每次向客戶端輸出多少數(shù)據(jù),如:$buffer=1023。如果不指定的話,就會(huì)將整個(gè)文件全部寫入內(nèi)存當(dāng)中,再一次性的講數(shù)據(jù)傳送給客戶端
通過feof()函數(shù),可以判斷要讀取的文件是否讀完,如果還沒讀完,繼續(xù)讀取文件($file_data=fread()),并將數(shù)據(jù)回送給客戶端(echo $file_data)
每次下載完成后,在客戶端都會(huì)刷新下,說明了,其實(shí)每次都將數(shù)據(jù)寫入到一個(gè)臨時(shí)文件中,等全部下載完成后,再將所有的數(shù)據(jù)重新整合在一起
這里我使用的是絕對(duì)路徑,絕對(duì)路徑有個(gè)好處,就是適應(yīng)性比較強(qiáng),而且相對(duì)于相對(duì)路徑,效率更高(免去了查找文件的過程)
分析下技術(shù)要點(diǎn):
將文件打包成zip格式
下載文件的功能
要點(diǎn)解析:
這里我采用的是php自帶的ZipArchive類
a) 我們只需要new一個(gè)ZipArchive對(duì)象,然后使用open方法創(chuàng)建一個(gè)zip文件,接著使用addFile方法,將要打包的文件寫入剛剛創(chuàng)建的zip文件中,最好還得記得關(guān)閉該對(duì)象。
b) 注意點(diǎn):使用open方法的時(shí)候,第二個(gè)參數(shù)$flags是可選的,$flags用來指定對(duì)打開的zip文件的處理方式,共有四種情況
i. ZIPARCHIVE::OVERWRITE 總是創(chuàng)建一個(gè)新的文件,如果指定的zip文件存在,則會(huì)覆蓋掉
ii. ZIPARCHIVE::CREATE 如果指定的zip文件不存在,則新建一個(gè)
iii. ZIPARCHIVE::EXCL 如果指定的zip文件存在,則會(huì)報(bào)錯(cuò)
iv. ZIPARCHIVE::CHECKCONS
下載文件的流程:
服務(wù)器端的工作:
客戶端的瀏覽器發(fā)送一個(gè)請(qǐng)求到處理下載的php文件。
注意:任何一個(gè)操作都首先需要寫入到內(nèi)存當(dāng)中,不管是視頻、音頻還是文本文件,都需要先寫入到內(nèi)存當(dāng)中。
換句話說,將“服務(wù)器”上的文件讀入到“服務(wù)器”的內(nèi)存當(dāng)中的這個(gè)操作時(shí)必不可少的(注意:這里我將服務(wù)器三個(gè)字加上雙引號(hào),主要是說明這一系類的操作時(shí)在服務(wù)器上完成的)。
既然要將文件寫入到內(nèi)存當(dāng)中,就必然要先將文件打開
所以這里就需要三個(gè)文件操作的函數(shù)了:
一:fopen($filename ,$mode)
二:fread ( int $handle , int $length )
三:fclose ( resource $handle )
客戶端端的工作:
那么,如何將已經(jīng)存在于服務(wù)器端內(nèi)存當(dāng)中的文件信息流,傳給客戶端呢?
答案是通過header()函數(shù),客戶端就知道該如何處理文件,是保存還是打開等等
最終的效果如下圖所示:
復(fù)制代碼 代碼如下:
require'./download.php';
/**
* 遍歷目錄,打包成zip格式
*/
class traverseDir{
public $currentdir;//當(dāng)前目錄
public $filename;//文件名
public $fileinfo;//用于保存當(dāng)前目錄下的所有文件名和目錄名以及文件大小
public function __construct(){
$this->currentdir=getcwd();//返回當(dāng)前目錄
}
//遍歷目錄
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('當(dāng)前目錄不是有效目錄');</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($zipname.'.zip',ZipArchive::OVERWRITE);//創(chuàng)建一個(gè)空的zip文件
for ($i=0;$i
}
$zip->close();
$dw=new download($zipname.'.zip'); //下載文件
$dw->getfiles();
unlink($zipname.'.zip'); //下載完成后要進(jìn)行刪除
}
}
}
?>
復(fù)制代碼 代碼如下:
/**
* 下載文件
*
*/
class download{
protected $_filename;
protected $_filepath;
protected $_filesize;//文件大小
public function __construct($filename){
$this->_filename=$filename;
$this->_filepath=dirname(__FILE__).'/'.$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);//去小數(shù)點(diǎn)后兩位
}
//下載文件的功能
public function getfiles(){
//檢查文件是否存在
if (file_exists($this->_filepath)){
//打開文件
$file = fopen($this->_filepath,"r");
//返回的文件類型
Header("Content-type: application/octet-stream");
//按照字節(jié)大小返回
Header("Accept-Ranges: bytes");
//返回文件的大小
Header("Accept-Length: ".filesize($this->_filepath));
//這里對(duì)客戶端的彈出對(duì)話框,對(duì)應(yīng)的文件名
Header("Content-Disposition: attachment; filename=".$this->_filename);
//修改之前,一次性將數(shù)據(jù)傳輸給客戶端
echo fread($file, filesize($this->_filepath));
//修改之后,一次只傳輸1024個(gè)字節(jié)的數(shù)據(jù)給客戶端
//向客戶端回送數(shù)據(jù)
$buffer=1024;//
//判斷文件是否讀完
while (!feof($file)) {
//將文件讀入內(nèi)存
$file_data=fread($file,$buffer);
//每次向客戶端回送1024個(gè)字節(jié)的數(shù)據(jù)
echo $file_data;
}
fclose($file);
}else {
echo "<script>alert('對(duì)不起,您要下載的文件不存在');</script>";
}
}
}
?>
頁面顯示的代碼:
復(fù)制代碼 代碼如下:
header("Content-type:text/html;charset=utf8");
require('./getfile.php');
$scandir=new traverseDir();
$scandir->scandir($scandir->currentdir);
$scandir->currentdir;
if (isset($_POST['down_load'])){
$items=$_POST['items'];
$scandir->tozip($items);//將文件壓縮成zip格式
}
echo "當(dāng)前的工作目錄:".$scandir->currentdir;
echo "
當(dāng)前目錄下的所有文件";
?>

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

PHP設(shè)置的關(guān)鍵在於明確安裝方式、配置php.ini、連接Web服務(wù)器及啟用必要擴(kuò)展。 1.安裝PHP:Linux用apt、Mac用Homebrew、Windows推薦XAMPP;2.配置php.ini:調(diào)整錯(cuò)誤報(bào)告、上傳限制等並重啟服務(wù)器;3.搭配Web服務(wù)器:Apache通過mod_php,Nginx使用PHP-FPM;4.安裝常用擴(kuò)展:如mysqli、json、mbstring等以支持完整功能。

寫好PHP註釋的關(guān)鍵在於明確目的與規(guī)範(fàn),註釋應(yīng)解釋“為什麼”而非“做了什麼”,避免冗餘或過於簡單。 1.使用統(tǒng)一格式,如docblock(/*/)用於類、方法說明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背後的原因,如說明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問題,便於後續(xù)追蹤與協(xié)作。好的註釋能降低溝通成本,提升代碼維護(hù)效率。

易於效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

註釋不能馬虎是因?yàn)樗忉尨a存在的原因而非功能,例如兼容老接口或第三方限制,否則看代碼的人只能靠猜。必須加註釋的地方包括複雜的條件判斷、特殊的錯(cuò)誤處理邏輯、臨時(shí)繞過的限制。寫註釋更實(shí)用的方法是根據(jù)場(chǎng)景選擇單行註釋或塊註釋,函數(shù)、類、文件開頭用文檔塊註釋說明參數(shù)與返回值,並保持註釋更新,對(duì)複雜邏輯可在前面加一行概括整體意圖,同時(shí)不要用註釋封存代碼而應(yīng)使用版本控制工具。

PHPblockcommentsareusefulforwritingmulti-lineexplanations,temporarilydisablingcode,andgeneratingdocumentation.Theyshouldnotbenestedorleftunclosed.BlockcommentshelpindocumentingfunctionswithPHPDoc,whichtoolslikePhpStormuseforauto-completionanderrorche

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

寫好註釋的關(guān)鍵在於說明“為什麼”而非僅“做了什麼”,提升代碼可讀性。 1.註釋應(yīng)解釋邏輯原因,例如值選擇或處理方式背後的考量;2.對(duì)複雜邏輯使用段落式註釋,概括函數(shù)或算法的整體思路;3.定期維護(hù)註釋確保與代碼一致,避免誤導(dǎo),必要時(shí)刪除過時(shí)內(nèi)容;4.在審查代碼時(shí)同步檢查註釋,並通過文檔記錄公共邏輯以減少代碼註釋負(fù)擔(dān)。

寫好PHP註釋的關(guān)鍵在於清晰、有用且簡潔。 1.註釋應(yīng)說明代碼背後的意圖而非僅描述代碼本身,如解釋複雜條件判斷的邏輯目的;2.在魔術(shù)值、舊代碼兼容、API接口等關(guān)鍵場(chǎng)景添加註釋以提升可讀性;3.避免重複代碼內(nèi)容,保持簡潔具體,並使用標(biāo)準(zhǔn)格式如PHPDoc;4.註釋需與代碼同步更新,確保準(zhǔn)確性。好的註釋應(yīng)站在他人角度思考,降低理解成本,成為代碼的理解導(dǎo)航儀。
