🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 文件编程 ⦁文件编程的必要性 ⦁在网站开发中,我们要使用到文件的上传和下载,就是经典的文件编程的使用 ⦁文件的基本概念 文件就是保存数据(二进制素具,文本数据),在程序员看来,文件就是数据的来源。 ⦁文件流 在对文件进行操作的过程中,我们以流的概念来操作 ### ![](https://box.kancloud.cn/2016-06-03_5750fd9103679.jpg) 从该图中我们可以看出,如果你的数据是从程序(内存)向文件(磁盘)流动,则我们成为输出流,反之输入流。 ⦁文件-操作的方式 本地操作和远程操作(通过网络) ⦁常用的文件操作函数 ⦁获取文件信息函数 ~~~ <?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 必须填写成上面内容:下面界面如下: ![](https://box.kancloud.cn/2016-06-03_5750fd9116964.jpg) 采用前面讲解的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文件上传后缀名与文件类型对照表](http://www.jb51.net/article/23511.htm)  文件编程到此结束,有深入的问题欢迎在下面指出!