牛骨文教育服务平台(让学习变的简单)

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>";
    		//注意:在默认情况下,我们得到的内容输出到网页后,是没有换行的
    		//不认
 需要进行下面的替换
    		$con1 = str_replace("
", "</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("
", "</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>";
    		     //注意:在默认情况下,我们得到的内容输出到网页后,是没有换行的
    		    //不认
 需要进行下面的替换
    		    $con1 = str_replace("
", "</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
";
            fwrite($fp, $buf);

         }else{
              echo "file open error!";
          }
     }else{
          echo "file is not exist!";
     }
     fclose($fp);
     */
    /*********另外方法********/
    $con = "woaini
";
    //默认情况,即不加第三个参数,则是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
";
    	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,"."));


参考资料:

   PHP文件上传后缀名与文件类型对照表 
文件编程到此结束,有深入的问题欢迎在下面指出!