文件打包,下載之使用PHP自帶的ZipArchive壓縮文件并下載打包好的文件_第1頁
文件打包,下載之使用PHP自帶的ZipArchive壓縮文件并下載打包好的文件_第2頁
文件打包,下載之使用PHP自帶的ZipArchive壓縮文件并下載打包好的文件_第3頁
文件打包,下載之使用PHP自帶的ZipArchive壓縮文件并下載打包好的文件_第4頁
文件打包,下載之使用PHP自帶的ZipArchive壓縮文件并下載打包好的文件_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、總結(jié):                                                        1. 使用PHP下載文件的操作需要給出四個header(),可以參考我的另一篇博文:PHP如何實現(xiàn)下載功能超詳細流程分析2. 計算文件的大小的時候,并不需要先打開文件,通過

2、filesize($filename)就可以看出,如果需要先打開文件的話,filesize可能就會是這樣的形式了filesize($filehandle)3. 向客戶端回送數(shù)據(jù)的是,記得要設(shè)置一個buffer,用來指定每次向客戶端輸出多少數(shù)據(jù),如:$buffer=1023。如果不指定的話,就會將整個文件全部寫入內(nèi)存當中,再一次性的講數(shù)據(jù)傳送給客戶端4. 通過feof()函數(shù),可以判斷要讀取的文件是否讀完,如果還沒讀完,繼續(xù)讀取文件($file_data=fread(),并將數(shù)據(jù)回送給客戶端(echo $file_data)5. 每次下載完成后,在客戶端都會刷新下,說明了,其實每次都將數(shù)據(jù)寫入到

3、一個臨時文件中,等全部下載完成后,再將所有的數(shù)據(jù)重新整合在一起6. 這里我使用的是絕對路徑,絕對路徑有個好處,就是適應(yīng)性比較強,而且相對于相對路徑,效率更高(免去了查找文件的過程)分析下技術(shù)要點:             1. 將文件打包成zip格式2. 下載文件的功能要點解析:1. 這里我采用的是php自帶的ZipArchive類a) 我們只需要new一個ZipArchive對象,然后使用open方法創(chuàng)建一個zip文件,接著使用addFile方法,將要打包的文件寫入剛剛創(chuàng)建的zip文件中,最好還得記得關(guān)閉該對象。b) 注意

4、點:使用open方法的時候,第二個參數(shù)$flags是可選的,$flags用來指定對打開的zip文件的處理方式,共有四種情況                   i.     ZIPARCHIVE:OVERWRITE 總是創(chuàng)建一個新的文件,如果指定的zip文件存在,則會覆蓋掉           &#

5、160;          ii.    ZIPARCHIVE:CREATE     如果指定的zip文件不存在,則新建一個              iii.  ZIPARCHIVE:EXCL      如果指定的zip文件存在,則會報錯    

6、             iv.  ZIPARCHIVE:CHECKCONS 下載文件的流程:          服務(wù)器端的工作:-客戶端的瀏覽器發(fā)送一個請求到處理下載的php文件。注意:任何一個操作都首先需要寫入到內(nèi)存當中,不管是視頻、音頻還是文本文件,都需要先寫入到內(nèi)存當中。換句話說,將“服務(wù)器”上的文件讀入到“服務(wù)器”的內(nèi)存當中的這個操作時必不可少的(注意:這里我將服務(wù)器三個字加上雙引號,主要是說明這一系類的操作時在服務(wù)器上完成的)。<br&g

7、t;既然要將文件寫入到內(nèi)存當中,就必然要先將文件打開所以這里就需要三個文件操作的函數(shù)了:一:fopen($filename ,$mode)二:fread ( int $handle , int $length )三:fclose ( resource $handle )-客戶端端的工作:-那么,如何將已經(jīng)存在于服務(wù)器端內(nèi)存當中的文件信息流,傳給客戶端呢?答案是通過header()函數(shù),客戶端就知道該如何處理文件,是保存還是打開等等 最終的效果如下圖所示:  1 <?php 2 require'./download.php' 3 /* 4 * 遍歷目錄,

8、打包成zip格式 5 */ 6 class traverseDir 7 public $currentdir;/當前目錄 8 public $filename;/文件名 9 public $fileinfo;/用于保存當前目錄下的所有文件名和目錄名以及文件大小10 public function _construct()11 $this->currentdir=getcwd();/返回當前目錄12 13 /遍歷目錄14 public function scandir($filepath)15 if (is_dir($filepath)16 $arr=scandir($filepath);

9、17 foreach ($arr as $k=>$v)18 $this->fileinfo$v=$this->getfilesize($v);19 20 else 21 echo "<script>alert('當前目錄不是有效目錄');</script>"22 23 24 /*25 * 返回文件的大小26 *27 * param string $filename 文件名28 * return 文件大小(KB)29 */30 public function getfilesize($fname)31 return f

10、ilesize($fname)/1024;32 33 34 /*35 * 壓縮文件(zip格式)36 */37 public function tozip($items) 38 $zip=new ZipArchive();39 $zipname=date('YmdHis',time();40 if (!file_exists($zipname)41 $zip->open($zipname.'.zip',ZipArchive:OVERWRITE);/創(chuàng)建一個空的zip文件42 for ($i=0;$i<count($items);$i+)43 $zip

11、->addFile($this->currentdir.'/'.$items$i,$items$i);44 45 $zip->close();46 $dw=new download($zipname.'.zip'); /下載文件47 $dw->getfiles();48 unlink($zipname.'.zip'); /下載完成后要進行刪除 49 50 51 52 ?>    1 <?php 2 /* 3 * 下載文件 4 * 5 */ 6 class download 7 pr

12、otected $_filename; 8 protected $_filepath; 9 protected $_filesize;/文件大小10 public function _construct($filename)11 $this->_filename=$filename;12 $this->_filepath=dirname(_FILE_).'/'.$filename;13 14 /獲取文件名15 public function getfilename()16 return $this->_filename;17 18 19 /獲取文件路徑(包含文

13、件名)20 public function getfilepath()21 return $this->_filepath;22 23 24 /獲取文件大小25 public function getfilesize()26 return $this->_filesize=number_format(filesize($this->_filepath)/(1024*1024),2);/去小數(shù)點后兩位27 28 /下載文件的功能29 public function getfiles()30 /檢查文件是否存在31 if (file_exists($this->_filep

14、ath)32 /打開文件33 $file = fopen($this->_filepath,"r");34 /返回的文件類型35 Header("Content-type: application/octet-stream");36 /按照字節(jié)大小返回37 Header("Accept-Ranges: bytes");38 /返回文件的大小39 Header("Accept-Length: ".filesize($this->_filepath);40 /這里對客戶端的彈出對話框,對應(yīng)的文件名41 He

15、ader("Content-Disposition: attachment; filename=".$this->_filename);42 /修改之前,一次性將數(shù)據(jù)傳輸給客戶端43 echo fread($file, filesize($this->_filepath);44 /修改之后,一次只傳輸1024個字節(jié)的數(shù)據(jù)給客戶端45 /向客戶端回送數(shù)據(jù)46 $buffer=1024;/47 /判斷文件是否讀完48 while (!feof($file) 49 /將文件讀入內(nèi)存50 $file_data=fread($file,$buffer);51 /每次向客戶

16、端回送1024個字節(jié)的數(shù)據(jù)52 echo $file_data;53 54 55 fclose($file);56 else 57 echo "<script>alert('對不起,您要下載的文件不存在');</script>"58 59 60 61 ?>  頁面顯示的代碼: 1 <script type="text/javascript" src="jquery-1.7.2.js"></script> 2 <script type=&qu

17、ot;text/javascript" src="ajax.js"></script> 3 <?php 4 header("Content-type:text/html;charset=utf8"); 5 require('./getfile.php'); 6 $scandir=new traverseDir(); 7 $scandir->scandir($scandir->currentdir); 8 $scandir->currentdir; 9 10 if (isset($_POS

18、T'down_load') 11 $items=$_POST'items'12 $scandir->tozip($items);/將文件壓縮成zip格式13 14 echo "當前的工作目錄:".$scandir->currentdir;15 echo "<br>當前目錄下的所有文件"16 ?>17 18 <form action="list.php" method="POST">19 <table>20 <tr>21 <td></td>22 <td>名稱</td>23 <td>大小(KB)</td>24 </tr>25 <?php26 $res=$scandir->fileinfo;27 foreach ($res as $k=>$v)28 if (!($k='.' | $k='.') /過濾掉.和.29 ?>30 <tr>31 <td>&l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論