本文實例講述了PHP文件操作。分享給大家供大家參考,具體如下:
1、文件上傳
上傳域: input type="file"
普通文本框(text、password、textarea、radio、checkbox等):通過字節流的形式將數據提交到服務器
文件: 將文件以二進制編碼的形式提交過去,實現起來非常簡單,只需要在form標簽中增加 enctype="multipart/form-data"
!-- 例如 -->
form action="" method="post" enctype="multipart/form-data" >
input type="file" name="">
/form>
客戶端提交文件之后服務器端接受用 $_FILES 接收

所謂文件上傳就是將上圖的臨時文件移動到指定的目的地
使用函數 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 文件可以修改上傳文件限制: 是否允許上傳、上傳的臨時目錄、文件最大限制、一次上傳最大數量
1.3 防止文件被覆蓋
1、我們在服務器端進行驗證,在移動到目的地的時候,生成新的文件名時,使用隨機數命名,可以避免文件名重復
2、按日期保存文件夾
1.4 控制上傳的文件類型
一般需求是:.jpg .png .gif 格式的圖片
防止修改文件后綴然后上傳,可以借助php的擴展 Finfo,更加精確的獲得文件的類型
// 為了防止用戶修改文件后綴,使用php的一個擴展 Finfo 實現
# 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 設置私有的屬性
* @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);
//文件的后綴,從上傳的文件名稱中截取最后一個點后面的內容 strrchr
$ext = strrchr($file['name'],'.');
//分目錄保存上傳的文件,按照日期格式保存
$sub_path = $this->_upload_path.date('Ymd').'/'; // upload/20180731/
# 如果當前目錄不存在,需要先創建 ,絕對路徑
$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實現,精確獲得每個文件在網絡中的類型
$finfo = new Finfo(FILEINFO_MIME_TYPE);
$mime_type = $finfo -> file($file['tmp_name']);
if(!in_array($mime_type,$this->allow_mime_type)){
echo '文件類型不支持';
exit;
}
//參數1:待移動的文件(臨時文件)
//參數2:目的地
//返回結果布爾類型
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系統下面gbk編碼,php文件是utf-8編碼
//通常需要先將php文件的編碼修改為gbk
$full_name = iconv('utf-8','gbk',$full_name);
$filesize = filesize($full_name);
# 【主要】開始下載,通過header頭信息告訴瀏覽器我向你回應的是文件資源
//返回的文件
header("Content-type: application/octet-stream");
//按照字節大小返回
header("Accept-Ranges: bytes");
//顯示文件大小
header("Content-Length: $filesize");
//這里客戶端的彈出對話框,對應的文件名
header("Content-Disposition: attachment; filename=".$filename);
//開始讀取文件資源并回應給瀏覽器
$fp = fopen($full_name,'r');
while(!feof($fp)){
$data = fread($fp,1024);
echo $data;
}
fclose($fp);
3、分頁類
結合 bootstrap
/*
* 分頁顯示數據
*/
class Page
{
private $_total; //總的記錄數
private $_pagesize; //每頁顯示的記錄數
private $_pagenow; //當前頁碼數
private $_url; //點擊超鏈接時跳轉的url地址
/**
* set 設置私有的屬性
* @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;
}
}
//動態創建分頁導航條
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;
//創建中間的分頁導航按鈕
//先計算目前有多少頁 == 總的數據 / 每頁顯示的數據
$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; //跳出本次循環
}
$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;
//將創建的分頁導航條返回
return $PAGE;
}
}
更多關于PHP相關內容感興趣的讀者可查看本站專題:《php文件操作總結》、《PHP目錄操作技巧匯總》、《PHP常用遍歷算法與技巧總結》、《PHP數據結構與算法教程》、《php程序設計算法總結》及《PHP網絡編程技巧總結》
希望本文所述對大家PHP程序設計有所幫助。
您可能感興趣的文章:- PHP常用的文件操作函數經典收藏
- php常用文件操作函數匯總
- PHP編程中八種常見的文件操作方式
- 真正的ZIP文件操作類(php)
- PHP目錄與文件操作技巧總結(創建,刪除,遍歷,讀寫,修改等)
- 一個經典的PHP文件上傳類分享
- php+ajax實現圖片文件上傳功能實例
- PHP實現視頻文件上傳完整實例
- php 下載保存文件保存到本地的兩種實現方法
- php遍歷、讀取文件夾中圖片并分頁顯示圖片的方法
- PHP實現適用于文件內容操作的分頁類