PHP中的文件处理

文件系统的概述

任何类型的变量在程序运行的时候都会被加载到内存中去。但是内存有一个特点,不能持久的保存数据,一旦断电,内存中的数据就没有。

如果要持久保存数据,方法有两种:第一种是保存在文件里面,第二种方法是存储到数据库里面。

关于文件的操作大致有:创建,编辑,删除,复制,粘贴,文件上传和下载。

PHP里面对文件的操作基于UNIX操作系统的。所以在PHP中很多函数都类似于UNIX系统下面的命令。在Windows里面并没有提供UNIX系统的特性,但是大部分PHP文件操作函数还是支持的,有一小部分不支持。

 

 

文件类型

PHP是以UNIX的文件系统为模型,在UNIX系统里面,文件的类型可以分为7种:可能的值有 fifochardirblocklinkfile unknown

 

Windows系统里面,只有3种文件类型:dirfileunknown

 

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函数:是获取配置文件的属性值

 

posted @ 2017-08-19 14:19  Lexone  阅读(229)  评论(0)    收藏  举报