[PHP] 文件系统交互

1. 文件上传


1.1 文件上传表单

PHP支持文件上传,php.ini文件具有四个能够控制PHP如何处理文件上传的指令。

文件上传设置
指令
描述默认值
file_uploads控制是否允许HTTP的文件上传。ON
upload_tmp_dir指定上传文件在处理前的临时保存目录。NULL
upload_max_filesize控制允许上传的文件最大大小。2M
post_max_size控制PHP可接受的,通过POST上传数据的最大值。8M

为了实现文件上传功能,需要用到一些专门用于上传文件的HTML语法。在<form>标记中,必须设置属性enctype="multipart/form-data",这样,服务器就可以知道上传的文件带有常规的表单信息,另外必须有一个可以设置上传文件最大长度的表单域。这是一个隐藏域,例如:

<form action="test.php" method="post" enctype="multipart/form-data">
  <input type="hidden" name="MAX_FILE_SIZE" value="1000000"/>
  <input type="file" name="myfile" id="myfile"/>
  <input type="submit" value="Send"/>
</form>

可以为文件选择任何名字,但这将在PHP接收脚本中使用这个名字来访问文件。


1.2 处理文件的PHP

当文件被上传时,该文件被保存在临时目录中,如果在脚本执行完成之前不移动、复制或更改文件名称,该文件将被删除。

在PHP中,需要处理的数据保存在超级全局数组$_FILES中,如果开启了register_globals指令,也可以直接通过变量名称访问这些信息。保存$_FILES数组中的元素时,将同时保存HTML表单的<file>标记名称,所以数组具有如下内容:

1) $_FILES['myfile']['tmp_name']: 文件在WEB服务器中临时存储的位置。

2) $_FILES['myfile']['name']: 用户系统中的文件名称。

3) $_FILES['myfile']['size']: 文件的字节大小。

4) $_FILES['myfile']['type']: 文件的MIME类型,例如image/gif。

5) $_FILES['myfile']['error']: 任何与文件上传相关的错误代码。

每一个错误代码都有一个相关的错误常量,这些可能的常量和错误代码如下:

1) UPLOAD_ERROR_OK: 值为0,表示没有发生任何错误。

2) UPLOAD_ERR_INI_SIZE: 值为1,表示上传文件的大小超出了约定值。

3) UPLOAD_ERR_FORM_SIZE: 值为2,表示上传文件大小超出表单MAX_FILE_SIZE的值。

4) UPLOAD_ERR_PARTIAL: 值为3,表示文件只被部分上传。

5) UPLOAD_ERR_NO_FILE: 值为4,表示没有上传任何文件。

6) UPLOAD_NO_TMP_DIR: 值为6,表示在php.ini文件中没有指定临时目录。

7) UPLOAD_ERR_CANT_WRITE: 值为7,表示将文件写入磁盘失败。


2. 使用目录函数


2.1 读取目录

函数opendir()用于打开所浏览的目录,类似于fopen(),只是传递给此函数的参数不是文件名称,而是目录名称,例如:

$dir = opendir($dirname);

该函数将返回一个目录句柄,这点与fopen()相似。

在目录打开后,可以调用函数readdir($dir)从目录中读取文件,当该目录中没有可读的文件时,将返回false,例如:

while(($file = readdir($dir)) !== false)

当完成从目录中读取时,可以通过调用函数closedir($dir)关闭该目录,例如:

closedir($dir);

一个相关的实用函数是rewinddir($dir),此函数将所读的文件恢复到开始的目录。

除此之外,还可以使用PHP提供的dir类,该类具有handle和path属性,及read()、close()和rewind()方法,例如:

$dir = dir($dirname);
while(false !== ($file = $dir->read())) {
  ...
}
$dir->close();


2.2 获取当前目录信息

dirname($path)函数和basename($path)函数将分别返回路径的目录部分和路径的文件名称部分。

使用disk_free_space($path)函数,传递一个目录的路径,可以获得该目录所在文件系统的剩余空间大小(以字节为单位)。


2.3 创建和删除目录

除了可以读取信息和目录外,还可以用PHP的mkdir()和rmdir()函数来创建与删除目录,但必须具有对应路径的访问权限,例如:

mkdir($dirname, 0777);
rmdir($dirname);

要得到的权限码不一定是上面所需的权限码,当前的umask将与该值相与,才能获得真正的权限码,如果umask是022,那么得到的权限是0755,我们可能会重新设置umask码,例如:

$oldmask = umask(022);

umask()函数可以用来检查并修改当前的umask码,并且返回原umask码。 umask()函数对Windows系统没有作用。


3. 文件系统


3.1 获取文件信息

函数fileatime()和filemtime()将分别返回该文件最近被访问和最近被修改时间戳。

函数fileowner()和filegroup()将分别返回文件的用户标识(uid)和组标识(gid)。通过分别使用函数posix_getpwuid()和posix_getgrgid(),可以将它们转变成容易理解的名字。Windows下不支持或不可靠地支持这些函数。

函数fileperms()返回文件权限码,可以使用函数decoct()将权限格式化为八进制数。

函数filetype()返回一些关于所检查文件的类型信息。

函数filesize()返回文件的大小(以字节计算)。

另一组函数is_dir()、is_executable()、is_file()、is_link()、is_readable()和is_writable(),每一个函数都将检测一个文件的指定属性并返回true或false。

所有的文件状态函数的运行都很费时间,因此它们的结果将被缓存起来,如果要在变化前后检查文件信息,需要调用函数clearstatcache()。


3.2 更改文件属性

函数chgrp()、chmod()、chown()的功能都类似于UNIX中的同名函数,它们都不能在Windows的系统中运行。

函数chgrp()用于修改文件的组,但是此函数只能用于将组改成该用户所在的组,root用户除外。

函数chmod()用于修改文件权限,传递给此函数的权限码是UNIX中常见的chmod格式,如果按八进制方式来显示它们,应该给它们加上前缀0.

函数chown()用于修改文件的所有者。


3.3 创建、删除和移动文件

可以用函数touch()创建一个文件,或者修改文件上次被修改的时间。

也可以使用函数unlink()来删除一个文件。

函数copy()和rename()用来复制和重命名(移动)文件。


3.4 程序执行函数

exec()函数的原型如下:

string exec(string command[, array &result[, int &return_value]])

可以将要执行的命令作为输入参数传递给该函数,例如:

exec('ls -l');

该函数没有直接的输出,此函数将返回命令结果的最后一行,如果以result传递一个变量,此函数将返回字符串数组,这些字符串代表输出的每一行,如果以result_value传递一个变量,将获得返回代码。

passthru()函数的原型如下:

void passthru(string command[, int return_value])

函数passthru()直接将输出显示到浏览器,此函数无返回值。

system()函数原型如下:

string system(string command[, int return_value])

此函数将该命令的输出回显到浏览器,它将把每一行的输出向后对齐,返回输出的最后一行或false(如果失败)。

除这些函数外,反引号' ` '实际上也是可执行的操作符,它没有直接的输出,执行这个命令的结果是以字符串的形式返回。


3.5 环境变量交互

PHP提供了两个函数来使用环境变量:getenv()和putenv(),其中getenv()函数能够获得环境变量值,而putenv()能够设置环境变量值。这里的环境变量指运行PHP服务器上的环境变量。

运行phpinfo()函数,可以获得PHP所有环境变量的列表。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值