文件处理系统

  • php是以UNIX文件系统为模型的,因此在windows系统中我们只能获得“file”,“dir”或者“unknown”三种文件类型。而在UNIX系统中,我们可以获得“block”,“char”,“dir”,“fifo”,“file”,“link”七种类型
filetype()         --此函数可以判断文件类型

常用的文件属性处理函数

file_exists()      --检查目录或文件是否存在
filesize()         --取得文件大小,返回的是字节数
is_readable()      --判断给定的文件是否可读
is_writable()      --判断给定的文件是否可写
is_executable()    --判断给定的文件是否可执行
filectime()        --获取文件的创建时间
filemtime()        --获取文件的修改时间
fileatime()        --获取文件的访问时间
stat()             --获取文件的大部分属性,返回数组

1.目录的基本操作

在windows中默认使用“\”作为路径分隔符
在UNIX系统中使用“/”作为路径分隔符
当然windows也接受使用“/”作为分隔符,所以为了程序的可移植性,建议都使用“/”作为分隔符,另外PHP的内置常量DIRECTORY_SEPARTOR,其值为当前系统的默认文件路径分隔符。

basename()    --返回路径中的文件名部分
dirname()     --返回路径中的目录部分,和楼上相反
pathinfo()    --返回一个关联数组其中包括指定路径中的目录名、基本名和扩展名三个部分
建立和删除目录
mkdir()    --建立一个新目录
rmdir()    --只能删除一个空目录
unlink()   --删除一个文件

可以自定义一个函数使用递归方法删除一个非空目录

function  delDir($directory){
    if (file_exists($directory)) {
       if ($dir_handle = @opendir($directory)) {
         while ($filename = readdir($dir_handle)) {
           if ($filename != "." && $filename != "..") {
             $subFile = $directory.'/'.$filename;
             if (is_dir($subFile))
                delDir($subFile);
             if (is_file($subFile))
                unlink($subFile);
           }
         }
         closedir($dir_handle);
         rmdir($directory);
       }
    }
}
统计目录大小

自定义函数使用递归方法

function dirSize($directory) {
  $dir_size = 0;
  if ($dir_handle = @opendir($directory)) {
    while ($filename = readdir($dir_handle)) {
      if ($filename != '.' && $filename != '..') {
        $subFile = $directory.'/'.$filename;
        if (is_dir($subFile))
          $dir_size +=   dirSize($subFile);
        if (is_file($subFile))
          $dir_size +=  filesize($subFile);
      }
    }
    closedir($dir_handle);
    return $dir_size;
  }
}

2.文件的基本操作

基本的操作函数
fclose()      --关闭已打开的文件资源
fopen()       --打开一个文件,第一个参数需要被打开文件的URL,  第二个参数需要提供文件模式
copy(来源文件,目的文件)          --复制文件
unlink(目标文件)                 --删除文件
ftruncate(目标文件资源,截取长度)      --将文件截取到指定的长度
rename(旧文件名,新文件名)             --重命名文件名或者目录   

文件模式如下:

模式字符 描述
r 只读,从文件开头
r+ 读写,从文件开头
w 只写,从文件开头,如果文件存在,清空文件内容
w+ 读写,从文件开头,如果文件存在,清空文件内容
x 创建并以写入方式打开,从文件开头。如果文件存在返回false,仅用于本地文件
x+ 创建并以读写方式打开,从文件开头。如果文件存在返回false,仅用于本地文件
a 只写,从文件末尾追加
a+ 读写,从文件末尾追加
b 二进制模式打开,用于与其他模式进行连接
t 文本模式打开文件
文件写入
fwrite(resource handle,string string[,int length])     --执行后返回写入的字符数

file_put_contents()        --直接将数据写入指定的文件中,不过会清空之前的内容
读取文件内容
fread()               --读取打开的文件,第二个参数可设置读取多少字节
file_get_contents     --将文件读入到字符串
fgets()               --从打开的文件中返回一行
fgetc()               --从打开的文件中返回字符串
readfile()            --读取一个文件,并输出到输出缓冲
移动文件指针
ftell()        --返回文件指针到当前位置
fseek()        --移动文件指针到指定位置
rewind()      --移动文件指针到文件的开头
使用这些函数时,必须提供一个用fopen打开的,合法的文件指针。
函数ftell()获取文件当前位置的指针偏移量;
函数rewind()将文件指针移回到文件的开头;
而函数fseek()则将指针移动到第二个参数offset指定的位置,如果没有提供第三个参数whence,
则位置将设定为从文件开头的offset字节处。否则,第三个参数whence可以设置为三个可能的值,
它将影响指针的位置。
文件的锁定机制

在PHP中提供了flock() 函数,可以对文件使用锁定机制。当一个进程在访问文件时加上锁,其他进程想要对该文件进行访问,则必须等到锁定被释放之后,这样就可以避免在并发访问同一个文件时破坏数据。

bool flock( int handle, int operation [,int &wouldblock] )      --轻便的咨询文件锁定
第一个函数必须是一个已经打开的文件资源,
第二个参数operation也是必须的,规定使用哪种锁定类型。operation可以是以下值之一:
   >LOCK_SH取得共享锁定(从文件中读取数据时使用)
   >LOCK_EX取得独占锁定(从文件中写入数据时使用)
   >LOCK_UN释放锁定(无论共享或独占锁,都用它释放)
   >LOCK_NB附加锁定(如果不希望flock()在锁定时堵塞,则应在上述锁定后加上该锁)
如果锁定会堵塞的话(已经被flock()锁定的文件,再次锁定时,flock()函数会被挂起,
这时称为锁定堵塞),也可以将选定的第三个参数设置为1,则当进行锁定时会阻挡其他进程。

文件的上传和下载

文件上传
  • 客户端上传设置
    文件上传的最基本方式是使用html表单选择本地文件进行提交,在form表单中可以通过标记选择本地文件。如果文件支持上传操作,必须在
    标签中将enctype和method两个属性指明相应的值,如下所示:

  
    
    文件上传
  
  
    
        
        选择文件:
        
    
  

  • 在服务器端通过PHP处理上传
    上传文件接收和后续处理就要通过php来处理。想要通过php成功的管理文件上传。需要通过以下三方面信息。如下所示:

    》 设置PHP配置文件中的指令: 用于精细的调节PHP的文件上传功能。
    》$_FILES多维数组: 用于储存各种与上传文件相关的信息,其他数据还使用$_POST去接收。
    》PHP的文件上传处理函数:用于上传文件的后续处理。

PHP配置文件中与文件上传有关的选项

指令名 默认值 功能描述
file_uploads ON 确定PHP脚本是否接收HTTP文件上传
upload_max_filesize 2M 限制PHP处理上传文件大小的最大值,此值必须小于post_max_size值
post_max_size 8M 限制通过POST方法可以接受信息的最大值,此值应当大于配置指令upload_max_file的值,因为除了上传的文件之外,还可能传递其他的表单域
upload_tmp_dir NULL 上传文件存放的临时路径,可以是一个绝对路径。

全局数组$_FILES中的元素说明

数组 描述
$FILES["myfile"]["name"] 客户端机器文件的原名称,包含扩展名
$FILES["myfile"]["size"] 已上传文件的大小,单位是字节
$FILES["myfile"]["tmp_name"] 文件被上传后,在临时目录中的文件名
$FILES["myfile"]["error"] ● 0 - 表示没有任何错误,文件上传成功;
● 1 -表示 大小超过了配置文件中upload_max_filesize选项限制的值;

● 2 -表示上传文件大小超过了HTML表单设置的最大值;
● 3 -文件只有部分被上传;
● 4 -没有上传任何文件
$FILES["myfile"]["error"] 获取上传文件的类型,比如是图片,视频,等等

上表中$_FILES数组的第一维“myfile”,代表的是上传表单元素()中的name属性的值,另外php还有两个专门用于文件上传所使用的函数

is_uploaded_file(string filename)   //判断指定的文件是否是通过HTTP POST上传的,函数的参数必须是指定类似于$FILES["myfile"]["tmp_name"] 的变量,才能判断指定的文件缺失是上传文件
move_uploaded_file()      //将上传的文件移动到新位置,虽然函数copy()和函数move() 同样好用,但是move_uploaded_file()  提供了一种额外的功能,就是判断第一个参数filename指定的文件,是否是合法的上传文件。如果不是则不会移动文件并且返回false
文件下载

简单的下载就像这样:

下载文件

一行代码直接搞定,
当然,为了提高安全性,当然要逼格高一点类似下面这样

header('Content-Type:image/gif;);
header('Content-Disposition:attachment;filename="test.gif"');
header('Content-Length:3390');

你可能感兴趣的:(文件处理系统)