国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 php教程 php手冊(cè) php文件打包 下載之使用PHP自帶的ZipArchive壓縮文件并下載打包好的文件

php文件打包 下載之使用PHP自帶的ZipArchive壓縮文件并下載打包好的文件

Jun 13, 2016 am 11:59 AM
php ziparchive 下載 使用 壓縮 總結(jié) 打包 文件 自帶

總結(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->addFile($this->currentdir.'/'.$items[$i],$items[$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)前目錄下的所有文件";
?>








$res=$scandir->fileinfo;
foreach ($res as $k=>$v){
if (!($k=='.' || $k=='..')) {//過濾掉.和..
?>





}
}
?>




名稱 大小(KB)


本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

PHP設(shè)置的簡單指南 PHP設(shè)置的簡單指南 Jul 18, 2025 am 04:25 AM

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評(píng)論的提示 撰寫PHP評(píng)論的提示 Jul 18, 2025 am 04:51 AM

寫好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ù)效率。

學(xué)習(xí)PHP:初學(xué)者指南 學(xué)習(xí)PHP:初學(xué)者指南 Jul 18, 2025 am 04:54 AM

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

編寫有效的PHP評(píng)論 編寫有效的PHP評(píng)論 Jul 18, 2025 am 04:44 AM

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

掌握PHP塊評(píng)論 掌握PHP塊評(píng)論 Jul 18, 2025 am 04:35 AM

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

快速PHP安裝教程 快速PHP安裝教程 Jul 18, 2025 am 04:52 AM

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

通過評(píng)論提高可讀性 通過評(píng)論提高可讀性 Jul 18, 2025 am 04:46 AM

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

有效的PHP評(píng)論 有效的PHP評(píng)論 Jul 18, 2025 am 04:33 AM

寫好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)航儀。

See all articles