zoukankan      html  css  js  c++  java
  • php文件系统

     PHP文件系统

    我们会点鼠标右键删除文件、会control+c(或右键)复制、粘贴文件,会新建一些文件,检测这个文件是不是只读文件。在电脑里面进行的这些操作,在代码里面如果能操作就好了。因为,如果有了这些操作。我们能做很多事情了:

    可不可以写入修改配置文件?

    是不是可以做PHP安装的时候检测文件的权限

    是不是可以做生成Html文件等等很多不同的操作

    ..... 其他太多太多的地方用到了文件操作。

    一、fopen、fread、fclose操作读取文件

     

    readfile读取文件

    那如何读取一个文件呢?我们先学一个函数。

    int 

    readfile ( string $文件名)

    功能:传入一个文件路径,输出一个文件。

    下面的这一段代码中,只要传入文件名或者指定的文件路径就把文件读取出来了。

    <?php
    
       //linux类的读了方式
    
       readfile("/home/paul/test.txt");
    
       //windows类的读取方式
    
       readfile("c:\boot.ini");
    
    ?>

    注意:上面的代码中windows的斜线是斜线,可能会转义掉一些字符。因此,我们写的时候写上两个斜线。

    file_get_contents打开文件

    //简单粗暴地读取文件,且不可以直接显示,必须echo打印!
    <?php
    
       $filename = 'NoAlike.txt';
    
       $filestring = file_get_contents($filename);
    
       echo $filestring;
    
    ?>

    fopen、fread、fclose操作读取文件

    上面file_get_contents打开文件的方式简单、粗暴。下面的

    resource fopen ( string $文件名, string 模式)
    
    string fread ( resource $操作资源, int 读取长度)
    
    bool fclose ( resource $操作资源 )
    
    fopen的模式有下面几个,我们来讲一下fopen的模式:

    模式

    说明

    r

    只读方式打开,将文件指针指向文件头。

    r+

    读写方式打开,将文件指针指向文件头。

    w

    写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建(覆盖内容)

    w+

    读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建

    a

    写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建

    a+

    读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之

    x

    创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建

    x+

    创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建

    <?php
    
       //你可以创建一个NoAlike.txt,以只读模式打开
    
       $fp = fopen('NoAlike.txt', "r"); 
    
       //var_dump()操作一下$fp看看效果,输出的是不是只有类型提示的是resource
    
       var_dump($fp);
    
    ?>

    二、php 创建和修改文件内容

    file_put_contents写入文件

    我们先来学习第一种写入文件的方式:

    int file_put_contents ( string $文件路径, string $写入数据])

    功能:向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度

    <?php
    
       $data = "在PHP中文网学好PHP,妹子票子不再话下!";
    
       $numbytes = file_put_contents('binggege.txt', $data);
    
       if($numbytes){
    
           echo '写入成功,我们读取看看结果试试:';
    
           echo file_get_contents('binggege.txt');
    
       }else{
    
           echo '写入失败或者没有权限,注意检查';
    
       }
    
    ?>

    fwrite配合fopen进行写入操作

    <?php
    
       $filename = 'test.txt';
    
       $fp= fopen($filename, "w");
    
       $len = fwrite($fp, '我是一只来自北方的狼,却在南方冻成了狗');
    
       fclose($fp);
    
       print $len .'字节被写入了
    ';
    
    ?>

    总结:
    1.不论有没有新建都会打开文件重新写入
    2.原有的文件内容会被覆盖掉
    3.文件不存在会创建

    那我们来对比一下以下几个模式的不同:

    模式

    说明

    r

    只能读不能使用fwrite

    r+

    可操作读、写

    w

    只可以写功能

    w+

    即可读又可以写

    x

    每次写入会干掉原有文件的内容,文件不存在都会创建

    a

    每次写入都会向文件的尾端追加内容

    注:a+ 是增强的追加功能。可以读取时也可以使用。

    三、php 创建临时文件

    我们之前创建的文件都是永久文件。

    而创建临时文件在我们平时的项目开发中也非常有用。创建临时文件的几个好处:

    文完后即删除

    不需要去维护这个文件的删除状态。

    <?php
    $tmp=tmpfile();
    $tmpf=fwrite($tmp,'闪现文件');
    fclose($tmp);
    print $tmpf.'个字节曾经出现过';
    ?>

    四、php移动、拷贝和删除文件

    我们日常在处理文件的时候,可以删除文件、重命名文件也可以也可复制文件。

    我们先来说重命名,重命名的函数是:

    重命名文件

    bool rename($旧名,$新名);

    这个函数返回一个bool值,将旧的名字改为新的名字。

    <?php
       //旧文件名
       $filename = 'test.txt';
       //新文件名
       $filename2 = $filename . '.new';
       //复制文件
       rename($filename, $filename2);
    ?>

    我们打开目录,我们可以看看效果,你会发现指定的文件已经命名改变。

    复制文件

    复制文件,就相当于是克隆技术,将一个原来的东西再克隆成一个新的东西。两个长得一模一样。

    bool copy(源文件,目标文件)

    功能:将指定路径的源文件,复制一份到目标文件的位置。

    我们来通过实验和代码来玩玩:

    <?php
       //旧文件名
       $filename = 'copy.txt';
       //新文件名
       $filename2 = $filename . '_new';
       //修改名字。
       copy($filename, $filename2);
    ?>

    我们打开目录,我们可以看看效果,你会发现指定的文件已经被copy另一份文件,源文件还在。

    总结:
    你会通过上面的例子,发现多出来了一个文件。

    删除文件

    删除文件就是将指定路径的一个文件删除,不过这个删除是直接删除。使用的是windows电脑,你在回收站看不到这个文件。

    你只会发现,这个文件消失了。

    bool unlink(指定路径的文件)

    <?php
       $filename = 'test.txt';
       if (unlink($filename)) {
           echo  "删除文件成功 $filename!
    ";
       } else {
           echo "删除 $filename 失败!
    ";
       }
    ?>

     移动文件

    先复制后删除源文件,此方式不多用!

    五、检测文件属性函数

    我们假设安装界面的网址是:install.php,安装的锁文件是install.lock。我们就可以检测install.lock文件是否存在。

    <?php
    if(file_exists('install.lock')){
       echo '已安装,请不要再次进行安装';
       exit;
    }
    ?>

    常用文件属性函

      bool file_exists ( $指定文件名或者文件路径)
        功能:文件是否存在。
    
        bool is_readable ( $指定文件名或者文件路径)
        功能:文件是否可读
    
        bool is_writeable ( $指定文件名或者文件路径)
        功能:文件是否可写
    
        bool is_executable ( $指定文件名或者文件路径)
        功能:文件是否可执行
    
        bool is_file ( $指定文件名或者文件路径)
        功能:是否是文件
    
        bool is_dir ( $指定文件名或者文件路径)
        功能:是否是目录
    
        void clearstatcache ( void )
        功能:清楚文件的状态缓存

     

    六、php 目录处理函数

    处理文件夹的基本思想如下:

        1.读取某个路径的时候判断是否是文件夹

        2.是文件夹的话,打开指定文件夹,返回文件目录的资源变量

        3.使用readdir读取一次目录中的文件,目录指针向后偏移一次

        4.使用readdir读取到最后,没有可读的文件返回false

        5.关闭文件目录

    我们来学习一比常用函数:

    函数名

    功能

    opendir

    打开文件夹,返回操作资源

    readdir

    读取文件夹资源

    is_dir

    判断是否是文件夹

    closedir

    关闭文件夹操作资源

    filetype

    显示是文件夹还是文件,文件显示file,文件夹显示dir

    <?php
    //设置打开的目录是D盘
    $dir = "d:/";
    //判断是否是文件夹,是文件夹
    if (is_dir($dir)) {
       if ($dh = opendir($dir)) {
          //读取到最后返回false,停止循环
          while (($file = readdir($dh)) !== false) {
               echo "文件名为: $file : 文件的类型是: " . filetype($dir . $file) . "<br />";
           }
           closedir($dh);
       }
    }
    ?>

    七、php 文件权限设置

    chmod 主要是修改文件的的权限

    <?php
    
    //修改linux  系统/var/wwwroot/某文件权限为755
    
    chmod("/var/wwwroot/index.html", 755);  
    
    chmod("/var/wwwroot/index.html", "u+rwx,go+rx"); 
    
    chmod("/somedir/somefile", 0755); 
    
    ?>

    八、php文件路径函数

    我们经常会遇到处理文件路径的情况。

    例如:

        1.文件后缀需要取出来

        2.路径需要取出名字不取目录

        3.只需要取出路径名中的目录路径

        4.或者把网址中的各个部份进行解析取得独立值

        5.甚至是自己组成一个url出来

        ... ....

    很多地方都需要用路径处理类的函数。

    我们把常用的路径处理函数为大家做了标注,大家对着这个路径处理函数进行处理即可:

    函数名

    功能

    pathinfo

    返回文件的各个组成部份

    basename

    返回文件名

    dirname

    文件目录部份

    parse_url

    网址拆解成各部份

    http_build_query

    生成url 中的query字符串

    http_build_url

    生成一个url

    <?php
    
    $path_parts = pathinfo('d:/www/index.inc.php');
    
    echo '文件目录名:'.$path_parts['dirname']."<br />";
    
    echo '文件全名:'.$path_parts['basename']."<br />";
    
    echo '文件扩展名:'.$path_parts['extension']."<br />";
    
    echo '不包含扩展的文件名:'.$path_parts['filename']."<br />"; 
    
    ?>

     

    九、php实现文件留言本(实践练习)

    我们来看一下文件结构:

    index.php ---展示输入框和留言内容

    write.php ---向message.txt写入数据

    message.txt ---存入聊天内容

    index.php文件

    //index.php文件内容
    <?php //设置时区 date_default_timezone_set('PRC'); //读了内容 $string=file_get_contents('message.txt'); if(!empty($string)){ $string = rtrim($string,'&^'); $arr = explode('&^',$string); foreach ($arr as $value) { //将用户名和内容分开 list($username, $content, $time) = explode('$#', $value); echo '用户名为<font color="gree">' . $username . '</font>内容为<font color="red">' . $content . '</font>时间为' . date('Y-m-d H:i:s', $time); echo '<br />'; } } ?> <h1>基于文件的留言本演示</h1> <form action="write.php" method="post"> 用户名:<input type="text" name="username" /><br /> 留言内容:<textarea name="content"></textarea><br /> <input type="submit" value="提交" /> </form>
    //write.php 文件内容
    <?php //追加方式打开文件 $fp=fopen('message.txt',"a"); //设置时间 $time=time(); //得到用户名 $username=trim($_POST['username']); //得到内容 $content=trim($_POST['content']); //组合写入的字符串:内容和用户之间分开,使用$# //行与行之间分开,使用&^ $string=$username.'$#'.$content.'$#'.$time.'&^'; //写入文 fwrite($fp,$string); //关闭文 fclose($fp); header('location:index.php'); ?>

    message.txt为空即可(和PHP文件在同一目录下)

    1.1.2 PHP文件上传

    在我们日常使用中经常会遇到很多种这样的情况:

    QQ空间里面上传图片呀

    微信朋友圈上传图片

    发邮件里面上传邮件资料附件

    认证的时候要求上传照片或身份证

    文件上传需要注意php.ini文件

    配置项

    功能说明

    file_uploads

    on为 开启文件上传功能,off为关闭

    post_max_size

    系统允许的POST传参的最大值

    upload_max_filesize

    系统允许的上传文件的最大值

    memory_limit

    内存使用限制

     

    建议尺寸: file_size(文件大小) < upload_max_filesize < post_max_size < memory_limit

    另外,需要注意的是脚本执行时间。

    max_execution_time,这什参数的单位为秒。

    这个参数是设定脚本的最大执行时间。

    也可以根据需求做适当的改变。通常不需要来修改,系统默认值即可。超大文件上传的时候,可能会涉及到这一项参数的修改。

    上传时间太长了,会超时。如果你将此项参数设为0,则是不限制超时时间,不建议使。

    完成了php.ini的相关配置,我们就可以开始试着完成第一次文件上传了。

    一、php文件上传的步骤

    1、系统返回的错误码详解:

    错误码

    说明

    0

    无误,可以继续进行文件上传的后续操作。

    1

    超出上传文件的最大限制,upload_max_filesize = 2M php.ini中设置,一般默认为2M。可根据项目中的实际需要来修改

    2

    超出了指定的文件大小,根据项目的业务需求指定上传文件的大小限制

    3

    只有部分文件被上传

    4

    文件没有被上传

    6

    找不到临时文件夹,可能目录不存在或没权限

    7

    文件写入失败,可能磁盘满了或没有权限


    注:错误码中没有5

     

    2、自定义判断是否超出文件大小范围

    在开发上传功能时。我们作为开发人员,除了php.ini中规定的上传的最大值外。

    我们通常还会设定一个值,是业务规定的上传大小限制。

    例如:

    新浪微博或者QQ空间只准单张头像图片2M。而在上传图册的时候又可以超过2M来上传。

    所以说,它的系统是支持更大文件上传的。

    此处的判断文件大小,我们用于限制实际业务中我们想要规定的上传的文件大小。

    3、判断后缀名和mime类型是否符合

    在网络世界里面也有坏人。他们会把图片插入病毒,在附件中上传病毒,他们会在网页中插入病毒或者黄色图片。

    我们需要对于上传的文件后缀和mime类型都要进行判断才可以。

    MIME(Multipurpose Internet Mail Extensions)是多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

    在判断后缀和MIME类型的时候,我们会用到PHP的一个函数in_array(),该函数传入两个参数。

    第一个参数是要判断的值;

    第二个参数是范围数组。

    我们用这个函数来判断文件的后缀名和mime类型是否在允许的范围内。

    4、生成文件名

    我们的文件上传成功了,不会让它保存原名。因为,有些人在原名中有敏感关键词会违反我国的相关法律和法规。我们可以采用date()、mt_rand()或者unique()生成随机的文件名。

    5、判断是否是上传文件

    文件上传成功时,系统会将上传的临时文件上传到系统的临时目录中。产生一个临时文件。同时会产生临时文件名。我们需要做的事情是将临时文件移动到系统的指定目录中。

    而移动前不能瞎移动,或者移动错了都是不科学的。移动前我们需要使用相关函数判断上传的文件是不是临时文件。

    is_uploaded_file()传入一个参数($_FILES中的缓存文件名),判断传入的名称是不是上传文件。

    6、移动临时文件到指定位置

    临时文件是真实的临时文件,我们需要将其移动到我们的网站目录下面了。

    让我们网站目录的数据,其他人可以访问到。

    我们使用:move_uploaded_file()。

    这个函数是将上传文件移动到指定位置,并命名。

    传入两个参数:

    第一个参数是指定移动的上传文件;

    第二个参数是指定的文件夹和名称拼接的字符串。

    二、php文件上传表单注意事项

    代码如下:

    1

    .index.html
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    </head>
    <body>
    <h1>上传文件</h1>
    <form action="chuli.php" method="post" enctype="multipart/form-data">
    请选择文件:<input type="file" name="file" /><input type="submit" value="上传" />
    </form>
    </body>
    </html>

    注意事项:

        1.form 表单中的参数method 必须为post。若为get是无法进行文件上传的

        2.enctype须为multipart/form-data

     

    2.chuli.php

    <?php
    //取文件信息
    $arr = $_FILES["file"];
    //var_dump($arr);
    //加限制条件
    //1.文件类型
    //2.文件大小
    //3.保存的文件名不重复
    if(($arr["type"]=="image/jpeg" || $arr["type"]=="image/png" ) && $arr["size"]<10241000 )
    {
    //临时文件的路径
    $arr["tmp_name"];
    //上传的文件存放的位置
    //避免文件重复:
    //1.加时间戳.time()加用户名.$uid或者加.date('YmdHis')
    //2.类似网盘,使用文件夹来防止重复
    $filename = "./images/".date('YmdHis').$arr["name"];
    //保存之前判断该文件是否存在
      if(file_exists($filename))
      {
        echo "该文件已存在";
      }
      else
      {
      //中文名的文件出现问题,所以需要转换编码格式
      $filename = iconv("UTF-8","gb2312",$filename);
      //移动临时文件到上传的文件存放的位置(核心代码)
      //括号里:1.临时文件的路径, 2.存放的路径
      move_uploaded_file($arr["tmp_name"],$filename);
      echo "文件上传成功";
      }
    }
    else
    {
      echo "上传的文件大小或类型不符";
    }
    ?>
  • 相关阅读:
    你试过不用if撸代码吗?
    Chrome开发者工具Debug入门
    我为什么推荐Prettier来统一代码风格
    使用JSDoc自动生成代码文档
    Async/Await是这样简化JavaScript代码的
    C#泛型约束 (转载)
    DateTime , DateTime2 ,DateTimeOffset 之间的小区别 (转载)
    允许跨域资源共享(CORS)携带 Cookie (转载)
    C#中如何利用操作符重载和转换操作符 (转载)
    EF Core 2.1 Raw SQL Queries (转自MSDN)
  • 原文地址:https://www.cnblogs.com/dazhu-secure/p/13732805.html
Copyright © 2011-2022 走看看