- 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表单中可以通过<input type="file">标记选择本地文件。如果文件支持上传操作,必须在<form>标签中将enctype和method两个属性指明相应的值,如下所示:
<html>
<head>
<meta charset="utf-8">
<title>文件上传</title>
</head>
<body>
<form class="" action="upload.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="10000000">
选择文件:<input type="file" name="myfile">
<input type="submit" name="" value="上传文件">
</form>
</body>
</html>
- 在服务器端通过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”,代表的是上传表单元素(<input type="file" name="myfile">)中的name属性的值,另外php还有两个专门用于文件上传所使用的函数
is_uploaded_file(string filename) //判断指定的文件是否是通过HTTP POST上传的,函数的参数必须是指定类似于$FILES["myfile"]["tmp_name"] 的变量,才能判断指定的文件缺失是上传文件
move_uploaded_file() //将上传的文件移动到新位置,虽然函数copy()和函数move() 同样好用,但是move_uploaded_file() 提供了一种额外的功能,就是判断第一个参数filename指定的文件,是否是合法的上传文件。如果不是则不会移动文件并且返回false
文件下载
简单的下载就像这样:
<a href="http://www.souhu.com/download/book.rar">下载文件</a>
一行代码直接搞定,
当然,为了提高安全性,当然要逼格高一点类似下面这样
header('Content-Type:image/gif;);
header('Content-Disposition:attachment;filename="test.gif"');
header('Content-Length:3390');
网友评论