PHP中的文件处理
文件系统的概述
任何类型的变量在程序运行的时候都会被加载到内存中去。但是内存有一个特点,不能持久的保存数据,一旦断电,内存中的数据就没有。
如果要持久保存数据,方法有两种:第一种是保存在文件里面,第二种方法是存储到数据库里面。
关于文件的操作大致有:创建,编辑,删除,复制,粘贴,文件上传和下载。
PHP里面对文件的操作基于UNIX操作系统的。所以在PHP中很多函数都类似于UNIX系统下面的命令。在Windows里面并没有提供UNIX系统的特性,但是大部分PHP文件操作函数还是支持的,有一小部分不支持。
文件类型
PHP是以UNIX的文件系统为模型,在UNIX系统里面,文件的类型可以分为7种:可能的值有 fifo,char,dir,block,link,file 和 unknown
在Windows系统里面,只有3种文件类型:dir,file,unknown
在PHP里面可以通过filetype()函数来获取文件类型
file_exists():判断一个文件是否存在
还有一组判断一个文件是否为某一个文件类型的函数,例如:is_dir(),is_file()
文件的属性
在PHP里面,也是可以获取到文件的属性的。例如:文件的大小,文件的创建时间,文件的修改时间。通过一组PHP函数都是可以获取到这些属性的
如下表:下面的函数接收的参数均为文件路径
|
函数 |
功能 |
返回值 |
|
file_exists() |
检测一个文件是否存在 |
返回true或者false |
|
filesize() |
获取文件的大小 |
返回文件大小的字节数 |
|
filectime() |
获取文件创建的时间 |
返回一个时间戳 |
|
filemtime() |
获取文件修改的时间 |
返回一个时间戳 |
|
fileatime() |
获取文件上一次访问的时间 |
返回一个时间戳 |
|
is_readable() |
判断文件是否可读 |
返回true或者false |
|
is_writeable() |
判断文件是否可写 |
返回true或者false |
|
is_executable() |
判断文件是否可执行 |
返回true或者false |
|
is_file() |
判断是否为一个文件 |
返回true或者false |
|
is_dir() |
判断是否为目录 |
返回true或者false |
|
stat |
获取文件的大部分信息 |
返回一个关于文件信息的数组 |
目录的基本操作
目录的路径
目录的路径分为两种:绝对路径和相对路径
绝对路径:所谓绝对路径,就是从根目录一级一级的往下找,最后找到指定的文件名或者目录。
相对路径:从当前的目录进入某一个目录,最后找到要找的文件名或者目录名
虽然windows下面的路径分隔符为\,但是也支持/,但是为了代码更好的移植性,一般就使用/作为路径分隔符
这里再介绍一个PHP里面的内置常量DIRECTORY_SEPARATOR,该常量就是用来表示路径分隔符的。
通常我们在编写程序的时候,将路径的各个部分取出来是很有必要的。这里介绍几个常用的basename(),dirname()和pathinfo()
basename():返回路径的文件名部分。可以接受两个参数,第一个参数为路径,第二个参数为文件类型,如果传入,则不显示文件的扩展名
dirname():获取路径的目录部分
pathinfo():会返回一个关联数组,该数组里面就包含目录名,完整的文件名,文件后缀和去掉后缀名的文件名
遍历目录
所谓遍历目录,就是指将目录下面的所有的文件输出一次
遍历目录需要用到如下的函数:
opendir():打开指定目录,会返回一个资源类型的数据
readdir():读取指定的目录,读取一次目录指针就会向后移动一次,当移动到末尾的时候,返回false
closedir():关闭指定目录
rewinddir():倒回目录指针,就是将目录指针移动到目录开始处
这里还存在一个问题:如果目录是中文,那么遍历的时候会出现乱码,为什么?原因很简单,PHP的编码为UTF-8,但是Windows中文版所使用的编码为GB2312,这个时候,我们就需要进行相应的转码
在PHP里面,提供了一个iconv()函数,可以进行转码。
iconv(“原来的编码”,”要转换成什么编码”,要进行转换的内容)
glob()函数:同样可以用来检索指定的目录,返回一个包含检索结果的数组
统计目录大小
在PHP系统里面,为我们提供了两个函数disk_free_space()和disk_total_space()
disk_free_space():统计磁盘空余的空间
disk_total_space():统计磁盘总共的空间
创建和删除目录
创建目录非常简单,PHP系统提供了mkdir()函数来创建目录,接收一个参数,目录的路径
删除目录使用的函数为rmdir().接收一个参数,就是要删除目录的路径
如果目录为一个非空目录,则rmdir()函数无法将其进行删除
通过系统提供unlink()函数可以删除文件
复制目录
在PHP里面提供给我们了一个函数copy函数,该函数接收两个参数
Copy(源文件的路径,复制文件的路径)
移动目录
PHP里面有一个rename()的系统函数,可以对目录和文件进行移动,移动的同时还可以对文件进行重命名
文件的相关操作
文件的打开
文件的打开使用fopen()函数,接收两个参数fopen(文件的路径,打开的方式)
文件的关闭
系统提供了fclose()函数来关闭打开的文件,需要传入一个参数,打开的资源
文件写入
PHP提供了一个fwrite()函数来将字符串写入到文件中。需要注意一个换行的问题。针对不同的操作系统,换行的字符有所不同。Windows系统换行使用的\r\n UNIX系统使用的是\n 苹果机系统的换行符为\r
fwrite(文件资源,写入的字符串,[写入长度])
该函数有一个别名函数fputs()函数,功能上和fwrite()函数的功能一模一样
PHP中还提供了一个file_put_contents()函数,也是用于快速写入,因为使用该函数就相当于依次调用fopen(),fwrite()和fclose()
读取文件
在PHP里面提供了一套读取文件的函数,如下表:
|
函数 |
描述 |
|
fread() |
读取打开的文件 |
|
file_get_contents() |
打开文件,读取文件,关闭文件 |
|
fgets() |
从打开的文件中返回一行 |
|
fgetc() |
从打开的文件中返回一个字符 |
|
file() |
把文件读取到一个数组里面 |
|
readfile() |
读取一个文件,直接输出到输出缓冲区 |
在读取文件的时候,如何判断文件是否到达末尾,根据标准,一般被称之为EOF(End Of File),在PHP里面,也给我们提供了一个函数,feof()用来判断一个文件指针是否到达文件的结束处,如果在结尾处,返回true,否则返回false
fread():在打开的文件中读取指定的长度
file_get_contents():相当于依次调用fopen(),fread()和fclose
fgets():从文件里面读取一行
fgetc():从打开的文件中获取一个字符,这个用得很少,了解即可
file():和file_get_contents()函数类似,不需要使用fopen()函数来打开文件,是文件一次性读取为一个数组
readfile():读取一个指定的文件,直接输出到输出的缓冲区里面。换句话说,就是一调用该函数,就立即输出,该函数也是不需要打开和关闭的。
文件上传与下载
上传文件在做开发的时候也是很常见的需求。关于文件上传一般分为两个部分:1. 客户端上传设置 2. 在服务器端通过PHP处理上传的文件
(1) 客户端上传设置
文件上传最基本的方法就是通过表单中的file控件来进行文件上传。
(2) 在服务器端通过PHP对上传文件进行处理
服务器端PHP处理上传文件主要需要了解3个方面的知识
① 关于PHP配置文件中的指令
|
指令名 |
默认值 |
描述 |
|
file_uploads |
On |
确定服务器上的PHP脚本是否可以接受HTTP文件上传 |
|
upload_max_filesize |
2MB |
限制PHP处理上传文件大小的最大值,这个值不能超过post_max_size |
|
post_max_size |
8MB |
限制通过post方法可以接收信息的最大值 |
|
upload_tmp_dir |
NULL |
上传文件的临时路径 |
|
max_file_uploads |
20 |
最大允许上传的文件个数 |
file_uploads:确定服务器上的PHP脚本是否可以接受HTTP文件上传
upload_max_filesize:限制PHP处理上传文件大小的最大值,这个值不能超过post_max_size
post_max_size:限制通过post方法可以接收信息的最大值
upload_tmp_dir:上传文件的临时路径
max_file_uploads:最大允许上传的文件数
② $_FILES多维数组
通过post方法上传的文件的相关信息就存储在这个超全局数组里面。该数组是一个二维数组。
|
数组 |
描述 |
|
$_FILES[“myFile”][“name”] |
上传文件的名字,包含扩展名 |
|
$_FILES[“myFile”][“size”] |
上传文件的大小,单位为字节 |
|
$_FILES[“myFile”][“tmp_name”] |
文件上传后的临时文件名 |
|
$_FILES[“myFile”][“error”] |
文件上传时的错误信息,有5个可能的值 0:表示没有任何错误,文件上传成功 1:表示上传的文件超出了在PHP配置文件中的upload_max_filesize的值 2:表示上传的文件超出了HTML表单里面的MAX_FILE_SIZE的值 3:表示文件只有部分被上传 4:没有上传任何文件 |
|
$_FILES[“myFile”][“type”] |
获取上传文件的MIME类型,/前面代表主类型,后面代表子类型 text/html image/png image/jpg image/gif |
③ PHP中为文件上传提供的两个函数
is_uploaded_file():判断文件是否是通过POST方法来上传的,如果是,则返回true,该函数需要传入一个参数:$_FILES[“myFile”][“tmp_name”],如果是POST方法上传而来的,返回true,否则返回false
move_uploaded_file(上传文件名,指定位置):将上传的文件移动到指定文件夹
处理多个文件上传
多个文件上传的方法和单独上传一个文件的方法是一样,只不过,在客户端要做一些改变
文件的下载
最简单通过a标签,如果a标签不能渲染出来,浏览器就会下载下来
要下载能渲染的文件,通过haader():它向浏览器
Ini_get函数:是获取配置文件的属性值
浙公网安备 33010602011771号