PHP文件操作實例總結(jié)【文件上傳、下載、分頁】
本文實例講述了PHP文件操作。分享給大家供大家參考,具體如下:
1、文件上傳
上傳域:
input type="file"
普通文本框(text、password、textarea、radio、checkbox等):通過字節(jié)流的形式將數(shù)據(jù)提交到服務(wù)器
文件: 將文件以二進制編碼的形式提交過去,實現(xiàn)起來非常簡單,只需要在form標簽中增加
enctype="multipart/form-data"
<!-- 例如 --> <form action="" method="post" enctype="multipart/form-data" > <input type="file" name=""> </form>
客戶端提交文件之后服務(wù)器端接受用 $_FILES 接收
所謂文件上傳就是將上圖的臨時文件移動到指定的目的地
使用函數(shù) move_uploaded_file( file,newpath)
返回bool值
1.1 文件上傳案例
// 例如 move_uploaded_file($_FILES['myfile']['tmp_name'], 'd:/upload/');
1.2 防止上傳文件過大
知識
1GB == 1024MB
1MB == 1024KB
1KB == 1024Byte
$max_size = 3*1024*1024; // 約束為3M if($_FILES['myfile']['size'] > $max_size){ echo '上傳圖片大于3M'; exit; } // 上傳 if(move_uploaded_file($_FILES['myfile']['tmp_name'], $path)){ echo '上傳成功'; } else { echo '上傳失敗'; }
注意 php.ini 文件可以修改上傳文件限制: 是否允許上傳、上傳的臨時目錄、文件最大限制、一次上傳最大數(shù)量
1.3 防止文件被覆蓋
1、我們在服務(wù)器端進行驗證,在移動到目的地的時候,生成新的文件名時,使用隨機數(shù)命名,可以避免文件名重復(fù)
2、按日期保存文件夾
1.4 控制上傳的文件類型
一般需求是:.jpg .png .gif 格式的圖片
防止修改文件后綴然后上傳,可以借助php的擴展 Finfo,更加精確的獲得文件的類型
// 為了防止用戶修改文件后綴,使用php的一個擴展 Finfo 實現(xiàn) # 1、開啟php.ini 中php擴展 extension=php_fileinfo.dll # 2、使用擴展類獲取上傳文件真實類型 $finfo = new Finfo(FILEINFO_MIME_TYPE); $mime_type = $finfo->file($_FILES['myfile']['tmp_name']);
自己封裝的上傳文件類
/* * 說明:文件上傳類 * 作者:sgw * 時間:2018-7-31 */ class Upload { //成員屬性 private $_maxsize = 2*1024*1024; //上傳的文件最大范圍2M private $_upload_path = 'upload/'; //上傳的文件保存路徑 private $_prefix = 'odshen_'; //文件名的前綴 private $allow_type = array('.jpg','.png','.gif','.jpeg'); //允許上傳的文件類型 private $allow_mime_type = array('image/jpeg','image/png','image/gif','image/jpg'); /** * set 設(shè)置私有的屬性 * @param [str] $p [屬性名] * @param [mix] $v [給屬性賦的值] */ public function __set($p,$v) { if(property_exists($this,$p)){ $this -> $p = $v; } } /** * get 獲取私有屬性 * @param [str] $p [屬性名] */ public function __get($p) { if(property_exists($this,$p)){ return $this -> $p; } } /** * 上傳文件方法 * @param [mix] $file [上傳的文件] */ public function doUpload($file) { //判斷用戶上傳的文件大小 $max_size = $this->_maxsize; //約束最大為2M if($file['size'] > $max_size){ echo '上傳文件過大,重新上傳'; exit; } #防止上傳的文件被覆蓋 $prefix = $this->_prefix; // 文件名唯一 $filename = uniqid($prefix,true); //文件的后綴,從上傳的文件名稱中截取最后一個點后面的內(nèi)容 strrchr $ext = strrchr($file['name'],'.'); //分目錄保存上傳的文件,按照日期格式保存 $sub_path = $this->_upload_path.date('Ymd').'/'; // upload/20180731/ # 如果當前目錄不存在,需要先創(chuàng)建 ,絕對路徑 $now_path = __DIR__.'/'; $now_path = str_replace('\\','/',$now_path.$sub_path); if(!is_dir($now_path)){ mkdir($now_path,0777,true); } # 限制用戶上傳的文件類型 if(!in_array($ext,$this->allow_type)){ echo '文件類型不支持'; exit; } # 防止用戶修改文件的后綴,借助php的一個擴展Finfo實現(xiàn),精確獲得每個文件在網(wǎng)絡(luò)中的類型 $finfo = new Finfo(FILEINFO_MIME_TYPE); $mime_type = $finfo -> file($file['tmp_name']); if(!in_array($mime_type,$this->allow_mime_type)){ echo '文件類型不支持'; exit; } //參數(shù)1:待移動的文件(臨時文件) //參數(shù)2:目的地 //返回結(jié)果布爾類型 if(move_uploaded_file($file['tmp_name'],$now_path.$filename.$ext)){ //上傳成功將上傳的文件地址返回,便于在其他地方使用該圖片,就需要能夠找到該圖片 return $sub_path . $filename.$ext; }else{ //echo '上傳失敗'; return false; } } }
2、文件下載
文件大的借助第三方軟件下載 ,例如百度云盤,迅雷;如果文件小,直接使用php進行下載
以下方法即可
//先接收地址欄中傳遞的文件名,也就是下載的是哪一個文件 $filename = $_GET['filename']; if($filename==''){ echo '文件未找到,下載失敗'; exit; } //拼接好文件的路徑 $full_name = 'img/'.$filename; //圖片在windows系統(tǒng)下面gbk編碼,php文件是utf-8編碼 //通常需要先將php文件的編碼修改為gbk $full_name = iconv('utf-8','gbk',$full_name); $filesize = filesize($full_name); # 【主要】開始下載,通過header頭信息告訴瀏覽器我向你回應(yīng)的是文件資源 //返回的文件 header("Content-type: application/octet-stream"); //按照字節(jié)大小返回 header("Accept-Ranges: bytes"); //顯示文件大小 header("Content-Length: $filesize"); //這里客戶端的彈出對話框,對應(yīng)的文件名 header("Content-Disposition: attachment; filename=".$filename); //開始讀取文件資源并回應(yīng)給瀏覽器 $fp = fopen($full_name,'r'); while(!feof($fp)){ $data = fread($fp,1024); echo $data; } fclose($fp);
3、分頁類
結(jié)合 bootstrap
/* * 分頁顯示數(shù)據(jù) */ class Page { private $_total; //總的記錄數(shù) private $_pagesize; //每頁顯示的記錄數(shù) private $_pagenow; //當前頁碼數(shù) private $_url; //點擊超鏈接時跳轉(zhuǎn)的url地址 /** * set 設(shè)置私有的屬性 * @param [str] $p [屬性名] * @param [mix] $v [給屬性賦的值] */ public function __set($p,$v) { if(property_exists($this,$p)){ $this -> $p = $v; } } /** * get 獲取私有屬性 * @param [str] $p [屬性名] */ public function __get($p) { if(property_exists($this,$p)){ return $this -> $p; } } //動態(tài)創(chuàng)建分頁導(dǎo)航條 public function create() { //定義首頁按鈕 //當前頁高亮顯示 $first_active = $this->_pagenow == 1?'active':''; $url = $this -> _url.'?page='; $first = 1; $PAGE = <<<HTML <ul class="pagination"> <li class="$first_active"><a href="$url$first" rel="external nofollow" >首頁</a></li> HTML; //創(chuàng)建中間的分頁導(dǎo)航按鈕 //先計算目前有多少頁 == 總的數(shù)據(jù) / 每頁顯示的數(shù)據(jù) $page_count = ceil($this -> _total / $this ->_pagesize); for($i=$this->_pagenow-3; $i<=$this->_pagenow+3; $i++){ $active = $this->_pagenow == $i?'active':''; if($i <= 1 || $i>= $page_count){ continue; //跳出本次循環(huán) } $PAGE .= <<<HTML <li class="$active"><a href="$url$i" rel="external nofollow" >$i</a></li> HTML; } //定義尾頁按鈕 $last_active = $this->_pagenow == $page_count?'active':''; $PAGE .= <<<HTML <li class="$last_active"><a href="$url$page_count" rel="external nofollow" >尾頁</a></li> </ul> HTML; //將創(chuàng)建的分頁導(dǎo)航條返回 return $PAGE; } }
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php文件操作總結(jié)》、《PHP目錄操作技巧匯總》、《PHP常用遍歷算法與技巧總結(jié)》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計算法總結(jié)》及《PHP網(wǎng)絡(luò)編程技巧總結(jié)》
希望本文所述對大家PHP程序設(shè)計有所幫助。
相關(guān)文章
PHP使用PDO訪問oracle數(shù)據(jù)庫的步驟詳解
POD擴展是在PHP5中加入,該擴展提供PHP內(nèi)置類 PDO來對數(shù)據(jù)庫進行訪問,不同數(shù)據(jù)庫使用相同的方法名,解決數(shù)據(jù)庫連接不統(tǒng)一的問題。下面這篇文章主要給大家介紹了關(guān)于PHP使用PDO訪問oracle數(shù)據(jù)庫的步驟,需要的朋友可以參考下。2017-09-09PHP基于數(shù)組實現(xiàn)的分頁函數(shù)實例
這篇文章主要介紹了PHP基于數(shù)組實現(xiàn)的分頁函數(shù)實例,是非常實用的一個技巧,需要的朋友可以參考下2014-08-08PHP 利用AJAX獲取網(wǎng)頁并輸出的實現(xiàn)代碼(Zjmainstay)
PHP 利用AJAX獲取網(wǎng)頁并輸出的實現(xiàn)代碼,需要的朋友可以參考下2012-08-08如何批量替換相對地址為絕對地址(利用bat批處理實現(xiàn))
你的url鏈接是相對路徑你想把他批量替換成絕對路徑該怎么做呢?下面與大家分享下具體的實現(xiàn)思路及代碼,只需點擊bat文件,全部頁面里的相對地址就會變成絕對地址了2013-05-05