1. 程式人生 > >PHP自學之路------PHP檔案程式設計

PHP自學之路------PHP檔案程式設計

檔案程式設計
⦁檔案程式設計的必要性
⦁在網站開發中,我們要使用到檔案的上傳和下載,就是經典的檔案程式設計的使用
⦁檔案的基本概念
檔案就是儲存資料(二進位制素具,文字資料),在程式設計師看來,檔案就是資料的來源。
⦁檔案流
在對檔案進行操作的過程中,我們以流的概念來操作

 
從該圖中我們可以看出,如果你的資料是從程式(記憶體)向檔案(磁碟)流動,則我們成為輸出流,反之輸入流。
⦁檔案-操作的方式
本地操作和遠端操作(通過網路)

⦁常用的檔案操作函式
⦁獲取檔案資訊函式
<?php
    //檔案的基本資訊
    //1、fopen 開啟檔案,引數 URL及 開啟方式MOde
    
    $file_path = "/var/myphp/file/file.txt";
    //該函式返回一個指向檔案的指標
    //chmod($file_path, 777);
    $fp = fopen($file_path, "r+");
    
    if($fp){
    	//fstat 獲得檔案的資訊
    	$file_info = fstat($fp);
    	echo "<pre>";
    	print_r($file_info);
    	echo "</pre>";
    	
    	echo "檔案大小".$file_info['size'];
    	
    } else{
    	echo "fopen file error!</br>";
    }
    
    
    //關閉檔案!!必須關閉
    fclose($fp);
    
    //****獲取檔案資訊第二種方式
    
    echo "<br/>".filesize($file_path);
    echo "<br/>".filemtime($file_path);
    echo "<br/>".filectime($file_path);
    echo "<br/>".fileatime($file_path);
 ?>


⦁讀檔案獲得檔案內容
<?php
/**
 *
 * @author jsh
 * @version 
 */
    
    $file_path = "/var/myphp/file/file.txt";
    //該函式返回一個指向檔案的指標
    
    /**********************一種讀取方式***********************
    if(file_exists($file_path)){
    	if($fp = fopen($file_path,"r+")){
    		$con = fread($fp, filesize($file_path));
    		echo "檔案的內容是:</br>";
    		//注意:在預設情況下,我們得到的內容輸出到網頁後,是沒有換行的
    		//不認\r\n 需要進行下面的替換
    		$con1 = str_replace("\n", "</br>", $con);
    		echo $con1;
    	}else{
    		echo "file open error!";
    	}
    }else{
    	echo "file is not exist!";
    }
   fclose($fp);
   */
    /***********************第二種讀取方式****************
    $con = file_get_contents($file_path);
    $con1 = str_replace("\n", "</br>", $con);
    echo $con1;
    */
   
    /***********************第三種讀取方式************/
    if(file_exists($file_path)){
    	if($fp = fopen($file_path,"r+")){
    		$buffer= 1024;
    		//一邊讀,一邊判斷是都到檔案的末尾
    		while(!feof($fp)){
    		    $con = fread($fp, $buffer);
    		    echo "檔案的內容是1111:</br>";
    		     //注意:在預設情況下,我們得到的內容輸出到網頁後,是沒有換行的
    		    //不認\r\n 需要進行下面的替換
    		    $con1 = str_replace("\n", "</br>", $con);
    		    echo $con1;
    		}
    	}else{
    		echo "file open error!";
    	}
    }else{
    	echo "file is not exist!";
    }
    fclose($fp);
    
    //檔案內容
   $arr =  parse_ini_file($file_path);
   
   echo "<pre>";
   print_r($arr);
   echo "</pre>";


⦁寫檔案
        
<?php
    //如何寫檔案
    
    $file_path = "/var/myphp/file/file.txt";

    
    /*************傳統的方法******************
     if(file_exists($file_path)){
     	//如果是追加內容,使用a+
     	//如果是全新的寫到檔案,則使用w+,清空原檔案再寫入
        if($fp = fopen($file_path,"a+")){
            $buf="asd123123\n";
            fwrite($fp, $buf);

         }else{
              echo "file open error!";
          }
     }else{
          echo "file is not exist!";
     }
     fclose($fp);
     */
    /***************另外方法**************/
    $con = "woaini\n";
    //預設情況,即不加第三個引數,則是w+方式
    file_put_contents($file_path, $con,FILE_APPEND);
    echo "write Ok!";
    //注意,此函式在底層呼叫fopen fwrite,呼叫這個函式一般不使用迴圈寫
    
    


⦁拷貝一個檔案
<?php
    //拷貝一個檔案
    //copy函式
    /***********注意***********
     * 預設情況下路徑是不能帶漢字的,如果使用漢字
     * 需要只用iconv("utf-8","gb2312","date");轉換下
     */
    $file_path="file.txt";
    $new_file="1.txt";
    if(!copy($file_path, $new_file)){
    	echo "copy error!";
    }else{
    	echo "copy OK!";
    }


⦁檔案下載
        http://blog.csdn.net/sjin_1314/article/details/8981745
⦁檔案建立,刪除,檔案的建立,刪除
<?php
    //檔案及資料夾的建立和刪除
    
    /************建立資料夾************
    $dir_name="/var/jsh1";
    if(!is_dir($dir_name)){
    	if(mkdir($dir_name)){
    		echo "建立檔案成功!</br>";
    	}else{
    		echo "建立失敗!</br>";
    	}
    }else{
    	echo "資料夾存在!</br>";
    }
    */
    /*********建立多級目錄*****/
    $dir_name="/var/jsh1/aaa/bbb/ccc";
    if(!is_dir($dir_name)){
    	if(mkdir($dir_name,0777,true)){
    		echo "建立檔案成功!</br>";
    	}else{
    		echo "建立失敗!</br>";
    	}
    }else{
    	echo "資料夾存在!</br>";
    }
    
    /*********刪除資料夾********/
    //如果資料夾下有檔案,或者目錄,均不能刪除
    if(rmdir("/var/jsh1/aaa/bbb/ccc")){
    	echo "刪除資料夾Ok!</br>";
    }
    
    /*************建立檔案*********/
    $file_name="/var/jsh1/1.txt";
    if($fp = fopen($file_name,"w+")){
    	$buf="asd123123\n";
    	fwrite($fp, $buf);
    
    }else{
    	echo "file open error!";
    }
    
    /***********刪除檔案******/
    //2個方法 delete 和unlink
    
    if(is_file($file_name)){
    	if(unlink($file_name)){
    		echo "刪除成功!</br>";
    	}
    }else{
    	echo "檔案不存在!</br>";
    }

•          檔案上傳
如果要上傳檔案,需要把
<formenctype="multipart/form-data"action="upLoad.php"name="myform"method="post">
Enctype  post 必須填寫成上面內容:下面介面如下:


                採用前面講解的Mvc模式,程式碼如下:

介面(V):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>檔案上傳</title>
</head>
<body>
    <form enctype="multipart/form-data" action="upProcess.php" name="myform" method="post">
         <table>
         <tr><td align="center" colspan="2" ><font style="font-size: 40px; 
         font-family:華文彩雲">檔案上傳</font></td></tr>
         <tr><td>請填寫使用者名稱:</td><td><input type="text" name="username" ></td></tr>
         <tr><td>請簡單介紹該檔案:</td><td><textarea name="fileinfo" rows="10" cols="80"></textarea></td></tr>
         <tr><td>請選擇要上傳的檔案:</td><td><input type="file" name="myfile"></td></tr>
         <tr><td><input type="submit" value="上傳檔案"></td><td></td></tr>
         </table>
    </form>
</body>
</html>

控制器(c)

<?php
    
    //獲得提交檔案的使用者
    $username=$_POST['username'];
    $fileinfo=$_POST['fileinfo'];
    
    
    //我們這邊需要使用到$FILES超全域性陣列,獲得上傳檔案屬性,列印如下
    
    echo "<pre>";
    print_r($_POST);
    print_r($_FILES);
    echo "</pre>";
    
    //獲取檔案的大小
    $file_size=$_FILES['myfile']['size'];
    if($file_size > 2*1024*1024){
    	echo "檔案過大!,不能上傳大於2M的檔案</br>";
        exit(1);
    }
    //獲取檔案的型別
    $file_type = $_FILES['myfile']['type'];
    if($file_type!='image/jpg' && $file_type!='image/jpeg' ){
    	echo "檔案型別只能是jpg的!</br>";
    	exit(1);
    }
    
    
    //判斷是否上傳成功
    if(is_uploaded_file($_FILES['myfile']['tmp_name'])){
    	
    	//把檔案轉存到指定的目錄
    	/*注意:
    	 * 上傳檔案的大小,在php.ini檔案中有說明,預設最大2M,可以自己設定
    	 * 
    	 * */
    	
    	//我們給每個使用者動態的建立一個資料夾
    	$user_path = "/var/myphp/file/".$username;
    	
    	//判斷該使用者是否存在資料夾
    	if(!file_exists($user_path)){
    		if(mkdir($user_path)){
    			echo "建立成功!</br>";
    		}
    	}
    			
    	//$file_path=$user_path.$_FILES['myfile']['name'];
    	$file_name=$_FILES['myfile']['name'];
    	$file_path=$user_path."/".time().rand(1,1000).substr($file_name, strrpos($file_name, '.'));
    	if(move_uploaded_file($_FILES['myfile']['tmp_name'], $file_path)){
    		echo "上傳成功!</br>";
    	}else{
    		echo "上傳失敗2!</br>";
    	}
    }else{
    	echo "上傳失敗1!</br>";
    }
    
    
?>

上傳檔案細節
1.        如果控制使用者上傳檔案的大小<2M
2.        如果控制使用者上傳的檔案型別
3.        如果防止使用者圖片覆蓋問題
解決方法:
給每個使用者建立一個資料夾(或者按照日期),將個人的檔案儲存的自己的資料夾裡面
4.        如果防止同一使用者檔名相同的問題
格式:路徑.時間戳.檔案字尾
$file_path=$user_path."/".time().rand(1,1000).substr($file_name,strrpos($file_name, '.'));

    參考資料:

檔案程式設計到此結束,有深入的問題歡迎在下面指出!