PHP简易在线文件管理器设计分析

0x01    模块分析


    既然是在线文件管理器,所以自然需要具备文件管理的一些基本功能,这里先用一个结构图来对我们的web文件管理器进行解构,以便更加清晰的了解我们的文件管理器的物理和逻辑。

1.png

    简单的结构差不多就是这个样子,index.html负责一些界面展示,通过button或者link来进行url跳转,发送指令给controller.php,而在controller.php中则封装了所有的处理函数,接收到index.html传过来的信息之后对指令进行处理,然后返回结果给index.html显示出来

0x02    逻辑处理

    咋一看其实挺简单的,仅仅一个文件管理器,只需要完成上面的那些功能就是了,貌似没什么难点,虽然在实现过程中也不算复杂,但有些逻辑问题还是值得探讨一下的。

1.路径遍历
    windows的文件结构是一种树状结构,其中每个文件夹中又隐藏着.(当前目录)和..(上级目录)两个文件,所以我们在读到这两个文件的时候需要特别处理一下。遍历路径可以通过php中自带的readdir($path)来进行读取,具体实现while($res=readdir($path)){}这样就循环读取了第一级下的所有文件或文件夹。此时我们就需要对读取到的内容进行判断了,是文件还是文件夹。php中为我们提供了两个很方便的函数,is_file()和is_dir(),判断完成后就可以将其装入不同的数组来进行后面的处理了。


2.文件信息获取

    我们首先可以通过filetype()来判断文件类型,比如是file你就为它赋予文件的图标,是folder你就为它赋予文件夹的图标。然后我们来获取文件的大小,通过filesize()获取的文件大小是byte,因此,我们需要用一个小算法来解决进制自动转化问题。

function countSize($file){
    $arr=array('b','kb','Mb','Gb','Tb');
    $i=0;
    while($file>1024){
        $file=filesize($file)/1024;
        $i++;
    }
echo round($file,2).$arr[$i];
round()函数用于截取小数点后两位。接下来便是获取文件的读写及执行权限了,很简单,php中内置有is_readable(),is_writable,is_executable()可以用于来检测这些这些权限,然后我们再获取一下文件的时间信息,filectime()文件创建时间,filemtime()文件修改时间,fileatime()文件最近访问时间,这三个函数返回的是一个时间戳,我们需要使用date("Y-M-D h:i:s",filectime($file))这样进行处理以返回可阅读的时间。


3.文件合法性处理
    php中没有专门的文件创建函数,因此一般都是通过一些检测函数来的,这些函数寻找指定文件,不存在的话则自动创建,像fopen()、touch()都是可以的。
    在创建文件的时候,windows是不允许文件名中出现像*#/\%?这样的字符的,因此我们需要对创建的文件名的合法性进行校验,这里可以使用preg_match($pattern,$filename)函数进行正则检查。
    此外,无论是创建、修改、拷贝,同名文件也是不被允许存在的,因此我们在创建时需要检查是否存在同名文件,使用file_exists($path)来检验。


4.文件的上传和下载

    我们知道,当我们通过网页直接访问一个资源文件时,如果该文件不能够被浏览器解析,比如.exe文件,就会自动下载,而如果能够解析,像.jpg.html.txt这种,浏览器则会直接解析出来,因此如果我们还想下载,就需要使用要header()+ReadFile()来进行处理了。

    header("content-disposition:attachment;filename=".$filename);
    header("content-length:".filesize($filename));
    readfile($filename);

   而上传文件我们则主要使用move_uploaded_file($file['tmpname'],$des)来实现,上传的文件也需要检查是否存在同名,或者自己以时间戳之类的方式为其重命名。


0x03    相关的函数


   
    opendir(),用于打开一个文件夹,返回该文件夹句柄
    readdir(),读取该文件夹中的文件
    file_get_content(),用于获取文件中的内容        
    file_put_content(),用于修改文件内容
    highlight_string(),highlight_file()两者均是php自带的代码高亮显示函数,在管理文件内容的时候可能会用到。
    rename($name,$newname),这是一个重命名函数,但是当第二个参数加上路径时,就可以将该文件移动至其它位置,因此,剪切也是可以使用这个函数来实现。
    dirname(),获取文件路径的路径部分        
    basename(),获取文件路径的文件部分
    unlink(),删除文件函数
    rmdir(),删除非空文件夹函数
    copy($file,$des),复制文件函数
    round($float,2),截取小数点后两位,截取位数自定义
    header(),发送文件头信息
    还有些函数在文中其它地方说道或者一时没想起来,就不一一赘述了。


0x04    一些需要注意的地方


 1.heredoc技术   
    为了界面的美化,需要一些点击事件来弹出内容提交框,平时则设置为隐藏。我们可以直接echo出这些表单和按钮出来,但这样会很不方便,而且单双引号也是一个很头疼的问题,php中为了使操作变得简单,提供了一种叫heredoc的技术,即在一串特殊的字符串内的内容都当成html代码来解析,比如我们定义一个表单 $form=<<<EOF <from name="" action="#" method="post"></form>  EOF;我们可以在EOF中自由写html代码而不用担心解析问题,最后在echo $form就行了。


2.文件夹和文件处理的区别
    php中不存在复制文件夹的函数,因此我们就只有创建同名文件夹mkdir(),然后通过递归来复制目标目录下的文件到新的文件夹,但剪切使用rename则不存在这个问题,文件文件夹都可以。
    php中不存在删除非空文件夹的函数,因此我们需要递归删除目标目录下的所有文件再通过rmdir()删除该文件夹。
    php中不存在直接获取文件夹大小的函数,因此我们也只有通过递归累加其目录下的所有文件大小来获取。

    

3.函数的复用
    在制作过程中,很多功能可能会被经常用到,每次去写就显得有点累赘了,因此,我们可以把这些功能封装成函数,需要的时候再调用就行。比如我们的文件管理器,可能经常会用到提示信息,我们就可以封装一个showMessage()函数,经常会检测文件名的合法性,就封装一个checkFile()函数,经常检测是否存在同名文件,就封装checkSame()函数,这样能尽可能的精简我们的代码。


4.Magic变量的使用
    __FILE__返回当前目录完整路径
    __FUNCTION__返回当前函数函数名


0x05    结尾
    整篇文章主要是简单对一个web文件管理器的设计过程的分析,当然其中还有些细节的地方没说出来,比如文件路径信息的传递,这点在开发中经常会制造出许多乱子,所以预先的设计十分重要,一个简易的在线文件管理器大概就是这个样子了。


本站部分资源收集于网络,纯个人收藏,无商业用途,如有侵权请及时告知!