PHP自学之路------PHP文件编程

文件编程
⦁ 文件编程的必要性
⦁ 在网站开发中,我们要使用到文件的上传和下载,就是经典的文件编程的使用
⦁ 文件的基本概念
文件就是保存数据(二进制素具,文本数据),在程序员看来,文件就是数据的来源。
⦁ 文件流
在对文件进行操作的过程中,我们以流的概念来操作

 
从该图中我们可以看出,如果你的数据是从程序(内存)向文件(磁盘)流动,则我们成为输出流,反之输入流。
⦁ 文件-操作的方式
本地操作和远程操作(通过网络)

⦁ 常用的文件操作函数
⦁ 获取文件信息函数

   

[php] view plain copy
 
 print?
  1. <?php  
  2.     //文件的基本信息  
  3.     //1、fopen 打开文件,参数 URL及 打开方式MOde  
  4.       
  5.     $file_path = "/var/myphp/file/file.txt";  
  6.     //该函数返回一个指向文件的指针  
  7.     //chmod($file_path, 777);  
  8.     $fp = fopen($file_path, "r+");  
  9.       
  10.     if($fp){  
  11.         //fstat 获得文件的信息  
  12.         $file_info = fstat($fp);  
  13.         echo "<pre>";  
  14.         print_r($file_info);  
  15.         echo "</pre>";  
  16.           
  17.         echo "文件大小".$file_info['size'];  
  18.           
  19.     } else{  
  20.         echo "fopen file error!</br>";  
  21.     }  
  22.       
  23.       
  24.     //关闭文件!!必须关闭  
  25.     fclose($fp);  
  26.       
  27.     //****获取文件信息第二种方式  
  28.       
  29.     echo "<br/>".filesize($file_path);  
  30.     echo "<br/>".filemtime($file_path);  
  31.     echo "<br/>".filectime($file_path);  
  32.     echo "<br/>".fileatime($file_path);  
  33.  ?>  



⦁ 读文件获得文件内容

[php] view plain copy
 
 print?
  1. <?php  
  2. /** 
  3.  * 
  4.  * @author jsh 
  5.  * @version  
  6.  */  
  7.       
  8.     $file_path = "/var/myphp/file/file.txt";  
  9.     //该函数返回一个指向文件的指针  
  10.       
  11.     /**********************一种读取方式*********************** 
  12.     if(file_exists($file_path)){ 
  13.         if($fp = fopen($file_path,"r+")){ 
  14.             $con = fread($fp, filesize($file_path)); 
  15.             echo "文件的内容是:</br>"; 
  16.             //注意:在默认情况下,我们得到的内容输出到网页后,是没有换行的 
  17.             //不认\r\n 需要进行下面的替换 
  18.             $con1 = str_replace("\n", "</br>", $con); 
  19.             echo $con1; 
  20.         }else{ 
  21.             echo "file open error!"; 
  22.         } 
  23.     }else{ 
  24.         echo "file is not exist!"; 
  25.     } 
  26.    fclose($fp); 
  27.    */  
  28.     /***********************第二种读取方式**************** 
  29.     $con = file_get_contents($file_path); 
  30.     $con1 = str_replace("\n", "</br>", $con); 
  31.     echo $con1; 
  32.     */  
  33.      
  34.     /***********************第三种读取方式************/  
  35.     if(file_exists($file_path)){  
  36.         if($fp = fopen($file_path,"r+")){  
  37.             $buffer= 1024;  
  38.             //一边读,一边判断是都到文件的末尾  
  39.             while(!feof($fp)){  
  40.                 $con = fread($fp, $buffer);  
  41.                 echo "文件的内容是1111:</br>";  
  42.                  //注意:在默认情况下,我们得到的内容输出到网页后,是没有换行的  
  43.                 //不认\r\n 需要进行下面的替换  
  44.                 $con1 = str_replace("\n", "</br>", $con);  
  45.                 echo $con1;  
  46.             }  
  47.         }else{  
  48.             echo "file open error!";  
  49.         }  
  50.     }else{  
  51.         echo "file is not exist!";  
  52.     }  
  53.     fclose($fp);  
  54.       
  55.     //文件内容  
  56.    $arr =  parse_ini_file($file_path);  
  57.      
  58.    echo "<pre>";  
  59.    print_r($arr);  
  60.    echo "</pre>";  



⦁ 写文件
        

[php] view plain copy
 
 print?
  1. <?php  
  2.     //如何写文件  
  3.       
  4.     $file_path = "/var/myphp/file/file.txt";  
  5.   
  6.       
  7.     /*************传统的方法****************** 
  8.      if(file_exists($file_path)){ 
  9.         //如果是追加内容,使用a+ 
  10.         //如果是全新的写到文件,则使用w+,清空原文件再写入 
  11.         if($fp = fopen($file_path,"a+")){ 
  12.             $buf="asd123123\n"; 
  13.             fwrite($fp, $buf); 
  14.  
  15.          }else{ 
  16.               echo "file open error!"; 
  17.           } 
  18.      }else{ 
  19.           echo "file is not exist!"; 
  20.      } 
  21.      fclose($fp); 
  22.      */  
  23.     /***************另外方法**************/  
  24.     $con = "woaini\n";  
  25.     //默认情况,即不加第三个参数,则是w+方式  
  26.     file_put_contents($file_path, $con,FILE_APPEND);  
  27.     echo "write Ok!";  
  28.     //注意,此函数在底层调用fopen fwrite,调用这个函数一般不使用循环写  
  29.       
  30.       



⦁ 拷贝一个文件

[php] view plain copy
 
 print?
  1. <?php  
  2.     //拷贝一个文件  
  3.     //copy函数  
  4.     /***********注意*********** 
  5.      * 默认情况下路径是不能带汉字的,如果使用汉字 
  6.      * 需要只用iconv("utf-8","gb2312","date");转换下 
  7.      */  
  8.     $file_path="file.txt";  
  9.     $new_file="1.txt";  
  10.     if(!copy($file_path, $new_file)){  
  11.         echo "copy error!";  
  12.     }else{  
  13.         echo "copy OK!";  
  14.     }  



⦁ 文件下载
        http://blog.csdn.net/sjin_1314/article/details/8981745
⦁ 文件创建,删除,文件的创建,删除

[php] view plain copy
 
 print?
  1. <?php  
  2.     //文件及文件夹的创建和删除  
  3.       
  4.     /************创建文件夹************ 
  5.     $dir_name="/var/jsh1"; 
  6.     if(!is_dir($dir_name)){ 
  7.         if(mkdir($dir_name)){ 
  8.             echo "创建文件成功!</br>"; 
  9.         }else{ 
  10.             echo "创建失败!</br>"; 
  11.         } 
  12.     }else{ 
  13.         echo "文件夹存在!</br>"; 
  14.     } 
  15.     */  
  16.     /*********创建多级目录*****/  
  17.     $dir_name="/var/jsh1/aaa/bbb/ccc";  
  18.     if(!is_dir($dir_name)){  
  19.         if(mkdir($dir_name,0777,true)){  
  20.             echo "创建文件成功!</br>";  
  21.         }else{  
  22.             echo "创建失败!</br>";  
  23.         }  
  24.     }else{  
  25.         echo "文件夹存在!</br>";  
  26.     }  
  27.       
  28.     /*********删除文件夹********/  
  29.     //如果文件夹下有文件,或者目录,均不能删除  
  30.     if(rmdir("/var/jsh1/aaa/bbb/ccc")){  
  31.         echo "删除文件夹Ok!</br>";  
  32.     }  
  33.       
  34.     /*************创建文件*********/  
  35.     $file_name="/var/jsh1/1.txt";  
  36.     if($fp = fopen($file_name,"w+")){  
  37.         $buf="asd123123\n";  
  38.         fwrite($fp, $buf);  
  39.       
  40.     }else{  
  41.         echo "file open error!";  
  42.     }  
  43.       
  44.     /***********删除文件******/  
  45.     //2个方法 delete 和unlink  
  46.       
  47.     if(is_file($file_name)){  
  48.         if(unlink($file_name)){  
  49.             echo "删除成功!</br>";  
  50.         }  
  51.     }else{  
  52.         echo "文件不存在!</br>";  
  53.     }  

•          文件上传
如果要上传文件,需要把
<formenctype="multipart/form-data"action="upLoad.php"name="myform"method="post">
Enctype  post 必须填写成上面内容:下面界面如下:

                采用前面讲解的Mvc模式,代码如下:

界面(V):

[html] view plain copy
 
 print?
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  2. <html>  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  5. <title>文件上传</title>  
  6. </head>  
  7. <body>  
  8.     <form enctype="multipart/form-data" action="upProcess.php" name="myform" method="post">  
  9.          <table>  
  10.          <tr><td align="center" colspan="2" ><font style="font-size: 40px;   
  11.          font-family:华文彩云">文件上传</font></td></tr>  
  12.          <tr><td>请填写用户名:</td><td><input type="text" name="username" ></td></tr>  
  13.          <tr><td>请简单介绍该文件:</td><td><textarea name="fileinfo" rows="10" cols="80"></textarea></td></tr>  
  14.          <tr><td>请选择要上传的文件:</td><td><input type="file" name="myfile"></td></tr>  
  15.          <tr><td><input type="submit" value="上传文件"></td><td></td></tr>  
  16.          </table>  
  17.     </form>  
  18. </body>  
  19. </html>  

控制器(c)

[php] view plain copy
 
 print?
  1. <?php  
  2.       
  3.     //获得提交文件的用户  
  4.     $username=$_POST['username'];  
  5.     $fileinfo=$_POST['fileinfo'];  
  6.       
  7.       
  8.     //我们这边需要使用到$FILES超全局数组,获得上传文件属性,打印如下  
  9.       
  10.     echo "<pre>";  
  11.     print_r($_POST);  
  12.     print_r($_FILES);  
  13.     echo "</pre>";  
  14.       
  15.     //获取文件的大小  
  16.     $file_size=$_FILES['myfile']['size'];  
  17.     if($file_size > 2*1024*1024){  
  18.         echo "文件过大!,不能上传大于2M的文件</br>";  
  19.         exit(1);  
  20.     }  
  21.     //获取文件的类型  
  22.     $file_type = $_FILES['myfile']['type'];  
  23.     if($file_type!='image/jpg' && $file_type!='image/jpeg' ){  
  24.         echo "文件类型只能是jpg的!</br>";  
  25.         exit(1);  
  26.     }  
  27.       
  28.       
  29.     //判断是否上传成功  
  30.     if(is_uploaded_file($_FILES['myfile']['tmp_name'])){  
  31.           
  32.         //把文件转存到指定的目录  
  33.         /*注意: 
  34.          * 上传文件的大小,在php.ini文件中有说明,默认最大2M,可以自己设置 
  35.          *  
  36.          * */  
  37.           
  38.         //我们给每个用户动态的创建一个文件夹  
  39.         $user_path = "/var/myphp/file/".$username;  
  40.           
  41.         //判断该用户是否存在文件夹  
  42.         if(!file_exists($user_path)){  
  43.             if(mkdir($user_path)){  
  44.                 echo "创建成功!</br>";  
  45.             }  
  46.         }  
  47.                   
  48.         //$file_path=$user_path.$_FILES['myfile']['name'];  
  49.         $file_name=$_FILES['myfile']['name'];  
  50.         $file_path=$user_path."/".time().rand(1,1000).substr($file_name, strrpos($file_name, '.'));  
  51.         if(move_uploaded_file($_FILES['myfile']['tmp_name'], $file_path)){  
  52.             echo "上传成功!</br>";  
  53.         }else{  
  54.             echo "上传失败2!</br>";  
  55.         }  
  56.     }else{  
  57.         echo "上传失败1!</br>";  
  58.     }  
  59.       
  60.       
  61. ?>  

上传文件细节
1.        如果控制用户上传文件的大小<2M
2.        如果控制用户上传的文件类型
3.        如果防止用户图片覆盖问题
解决方法:
给每个用户创建一个文件夹(或者按照日期),将个人的文件保存的自己的文件夹里面
4.        如果防止同一用户文件名相同的问题
格式:路径.时间戳.文件后缀
$file_path=$user_path."/".time().rand(1,1000).substr($file_name,strrpos($file_name, '.'));

    参考资料:

   PHP文件上传后缀名与文件类型对照表 

文件编程到此结束,有深入的问题欢迎在下面指出!
posted @ 2016-12-29 11:21  天涯海角路  阅读(199)  评论(0)    收藏  举报