PHP文件系统处理
所有文件处理都是使用系统函数完成的,PHP的文件处理是基于Linux/Unix系统为模型的。也就是说所有的文件处理函数在Linux/Unix下都可以正常执行,在Windows上也都大多可以正常使用,但可能会有部分不兼容的情况存在。
文件系统处理的作用:
1. 所有的项目离不开文件处理
2. 可以用文件长时间保存数据
3. 可用于建立缓存,以及服务器中文件操作
文件处理
1. 文件类型相关函数
以Linux为模型的, 在Windows只能获取file, dir或unknown 三种类型;在Linux/Unix下, block, char, dir, fifo, file, link, unknown七种类型。
block:块设置文件,如磁盘分区,软驱,cd-rom等;
char: 字符设备,I/O中以字符为单位,如键盘,打印机等;
dir: 目录也是文件的一种
fifo: 有名管道
file:普通文件的类型
link: 链接文件,想当于Windows下的快捷方式
unknown :未知类型
filetype(“目录或文件名”) 判断文件类型
is_dir() — 判断给定文件名是否是一个目录
is_executable() — 判断给定文件名是否可执行
is_file() — 判断给定文件名是否为一个正常的文件
is_link() — 判断给定文件名是否为一个符号连接
is_readable() — 判断给定文件名是否可读
is_uploaded_file() — 判断文件是否是通过 HTTP POST 上传的
is_writable() — 判断给定的文件名是否可写
is_writeable() — is_writable() 的别名
2. 文件的属性
file_exists()–判断文件是否存在
filesize()–获取文件大小
is_readable() — 判断给定文件名是否可读
is_writeable()– 判断给定的文件名是否可写
filectime()–文件的创建时间
filemtime()–文件的修改时间
fileatime()–文件的最后访问时间
stat()–文件的状态
3. 和文件路径相关的函数
相对路径:相对于当前目录的上级和下级目录
. 当前目录
.. 上一级目录
login.php
./login.php //前两者具有相同效果
../login.php
路径分隔符号
linux/Unix下使用 “/”
windows下使用 “\”
常量DIRECTORY_SEPARATOR 为适用不同平台,在Windows下的值为\,在 Linux下的值为 /。不管是什么操作系统,PHP的目录分割符号都支持正斜杠 / (Linux)。在PHP和Apache配置文件中如果需要指定目录,也使用/作为目录符号。
绝对路径:
/ 根路径
/images/index.php中/指的操作系统的根?还是指的是存放网站的文档根目录?分情况:
如果是在服务器中执行(通过PHP文件处理函数执行)路径,则 “根”指的就是操作系统的根;
如果程序是下载到客户端,在访问服务器中的文件时,只有通过Apache访问,“根”也就指的是文档的根目录
basename(url) 获取文件名
dirname(url) 获取目录部分(不包含文件名)
pathinfo(url) 获取路径信息
4. 文件的操作相关的函数
创建文件 touch(“文件名”)
删除文件 unlink(“文件路径”);
移动文件/为文件重新命名 rename(“当前文件路径”, “目录为文件路径”)
复制文件 copy(“当前文件路径”, “目录为文件路径”)
所有这个文件操作一定要有PHP执行这个文件权限, 即Apache中执行用户需要有这个权限
和权限设计有关的函数
ls -l 或 ll
_rwxrwxrwx 777
_ 代表类型,若为_表示文件,d 表示是目录,l表示是链接文件,b表示为块文件
第一组rwx 表示这个文件的拥有者 r读 w写 x执行
第二组rwx 表示这个文件的拥有者所在的组 r读 w写 x执行
第三组rwx表示 其它用户对这个为文件的权限 r读 w写 x执行
r 4
w 2
x 1
7 7 7 4+2+1 4+2+1 4+2+1
rwx rwx rwx
644(rw r r)
4+2 4 4
chmod u=rwx,g=rw,o=x
chmod 777 demo.php
chmod 644 demo.html
chown mysql demo.php
chgrp apache demo.php
chgrp — 改变文件所属的组
chmod — 改变文件模式
chown — 改变文件的所有者
filegroup — 取得文件的组
fileowner — 取得文件的所有者
5. 文件的打开与关闭(读文件中的内容, 向文件中写内容)
读取文件中的内容
file_get_contents()– 将整个文件读入一个字符串 //php5以上
file()– 把整个文件读入一个数组中
readfile()– 输出一个文件
上述函数不足:全部读取, 不能读取部分,也不能指定的区域
fopen(URL, mode)– 打开文件或者 URL,如fopen(“./test.txt”, “a+”)。fclose()关闭文件资源
fwrite fread
mode模式括
r 以只读模式打开文件
r+ 在只读基础上添加了只写
w 以只写的方式打开,如果文件不存在,则创建这个文件,并且写入内容,如果文件存在,并原来有内容,则会清除原文件中所有内容,再写入(切记不要以此模式打开已有的重要文件)
w+ 除了可以用(fwrite), 还可以读(fread)
a 以只写的方式打开,如果文件不存在,则创建这个文件,并写入内容,如果文件存在,并且原来有内容,则不清除原有文件内容,在原有文件内容的最后写入新内容(追加内容)
a+除了可以写(fwrite), 还可以读(fread)
b 以二进制模式打开文件(图片,电影)
t 以文本模式打开文件
fread()– 读取文件(可安全用于二进制文件)(取指定长度的字符)
fgetc() — 从文件指针中读取字符(一次从文件中读取一个字符)
fgets()– 从文件指针中读取一行(一次从文件中读取一行字符)
feof($file); 如果读取文件出错,或到文件结束,则返回真
写入文件
file_put_contents(“URL”, “内容字符串”)– 将一个字符串写入文件 //php5以上
如果文件不存在,则创建,并写入内容
如果文件存在,则删除文件中的内容,重新写入
上面函数不足: 不能以追加的方式写,也不能加锁
fopen()– 打开文件或者 URL
fwrite() 别名 fputs– 写入文件(可安全用于二进制文件),第一个参数是文件资源(fopen返回来的),第二个参数是写的内容
读写本地文件:
./test.txt
c:/appserv/www/index.html
/usr/local/apache/index.html
读写远程文件:
http://www.baidu.com(没有写的权限)
http://www.163.com(没有写的权限)
ftp://user@pass:www.baidu.com/index.php
6. 文件内部移动指针
ftell()– 返回文件指针读/写的位置
fseek() — 在文件指针中定位
fread()– 读取文件(可安全用于二进制文件)(取指定长度的字符)
rewind()– 倒回文件指针的位置
7. 文件的锁定一些机制处理
由于在现实应用中,有可能有多个读写在同时执行,为防止读写错乱,在读写时先锁定再读写然后再解锁。flock($file,operation)– 轻便的咨询文件锁定
要取得共享锁定(读取程序),将 operation 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。
要取得独占锁定(写入程序),将 operation 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。
要释放锁定(无论共享或独占),将 operation 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。
如果你不希望 flock() 在锁定时堵塞,则给 operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。
目录的处理
文件的操作: 创建文件, 删除文件, 重命名rename,获取文件大小,移动复制,读取
目录的操作: 创建目录,删除目录,复制目录, 统计目录大小(通过filesize()来累加目录中文件大小来获得目录大小), 遍历
1. 目录的遍历
opendir() — 打开目录句柄
readdir() — 从目录句柄中读取条目
closedir()– 关闭目录句柄
rewinddir()– 倒回目录句柄
2. 目录的创建
mkdir() — 创建一个空目录
3. 目录的删除
rmdir() — 只可以删除空目录
4. 目录的复制
移动和重命名rename() — 和文件操作一样
5. 统计目录大小
文件上传和下载
1. 上传
2. 下载
// touch(“./php.apahce”); //创建一个为文件
// unlink(“C:/AppServ/www/xsphp/apache.php”);
// rename(“./test.txt”, “d:/test2.txt”);
// copy(“cache.txt”, “./cache5.txt”);
chmod(“/aaa/index.php”, “755”);
文件上传
1. 单个文件上传
2. 多个文件上传
一、PHP配置文件中和上传文件有关的选项
php.ini中需开启 file_uploads = on
设置上传文件最大值upload_max_filesize= ***M 注意最大不要超过服务器的内存
上传文件的临时路径upload_tmp_dir = c:/uploads/
以post方式提交文件的最大值post_max_size = ***M(通常post_max_size一定大于upload_max_filesize, 因为除了上传文件,还可以post其它信息)
二、上传表单需要的注意事项
1. 如果有文件上传操作表单的提交方法必须是HTTP post
2. 表单上传需要使用type为file的表单
3. enctype=”multipart/form-data” 只有文件上传时才使用这个值 ,用来指定表单编码的数据方式, 让服务器知道,我们要传递一个文件并带有常规的表单信息。
4. 建议添加一个 MAX_FILE_SIZE 隐藏表单, 值的单位也是字节
三、PHP处理上传的数据
$_POST 接收非上传的数据
如果是文件上传的数据则使用 $_FILES处理上传的文件
上传文件的基本步骤是:
step 1 使用$_FILES[[“error”] 检查错误
UPLOAD_ERR_OK
其值为 0,没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE
其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE
其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL
其值为 3,文件只有部分被上传。
UPLOAD_ERR_NO_FILE
其值为 4,没有文件被上传。
UPLOAD_ERR_NO_TMP_DIR
其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
UPLOAD_ERR_CANT_WRITE
其值为 7,文件写入失败。PHP 5.1.0 引进。
注: 以上值在 PHP 4.3.0 之后变成了 PHP 常量。
step 2 使用$_FILES[[“size”] 限制大小,单位是字节 1M=1000000
step 3 使用$_FILES[“type”]或是文件的扩展名,限制类型 MIME,如image/gif,image/png,image/jpeg等,完整的mime类型可查看apache配置文件(conf文件夹下)中的mime.types文件。例如判断不是图片的不予以上传,采用类似如下代码(其中pic为上传文件input标签内的name属性),但这种做法会允许所有图片格式的上传,在实际操作中通常不会这样做
1 2 3 4 5 6 |
list($dl, $xl) = explode("/", $_FILES["pic"]["type"]); if($dl!="image"){ echo "请上传一个图片,不允许其它类型文件"; exit; } |
更具体地可以用后缀名的方式来进行判断
1 2 3 4 5 6 7 8 9 10 |
$allowtype=array("png", "gif", "jpg", "jpeg"); $arr=explode(".", $_FILES["pic"]["name"]); $hz=$arr[count($arr)-1]; if(!in_array($hz, $allowtype)){ echo "不允许上传jpg,gif,png以外类型的文件"; exit; } |
step 4 修改上传后的文件名名称
is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的
move_uploaded_file — 将上传的文件移动到新位置
文件下载
请求
1.协议 版本(如 HTTP 1.1)
2. 头信息,
3. 请求的表单信息, 提交给服务器的信息
服务器响应
1. 状态 200 ok 404 页面没找到
2. 响应头信息
3. 数据发送给客户端
常见的头信息:
1 2 3 4 |
header("Cache-Control: no-cache, must-revalidate"); header('Location: http://www.example.com/'); header('Content-type: application/pdf'); header('Content-Disposition: attachment; filename="downloaded.pdf"'); |