第19章 与文件系统和服务器的交互
在第2章中,我们已经了解了如何在Web服务器上读数据,以及如何将数据写入一个文件中。本章将介绍允许与Web服务器文件系统进行交互的PHP其他函数。
在本章中,我们将主要介绍以下内容:
■使用PHP上传文件
■使用目录函数
■与服务器上的文件进行交互
■在服务器上运行程序
■使用服务器环境变量
为了讨论这些函数的使用,我们首先来了解一个例子。考虑到我们可能会希望客户能够更新一些网站内容,例如,关于他们公司的最新消息(或者我们可能想为自己设计一个比FTP更友好的用户界面)。解决此类问题的一种方法是让客户以普通文本的方式上传文件内容。通过使用由PHP设计的模板,这些文件是可以在网站中访问到的,正如我们在第6章中所介绍的一样。
在开始研究文件系统函数之前,先让我们简单地了解一下文件是如何上传的。
19.1 文件上传
PHP的一个非常有用的功能是它支持文件上传。不是使用HTTP将服务器上的文件传递到客户端的浏览器,而是以相反的方向执行——使用HTTP将文件从客户端浏览器传递到服务器。通常,可以使用HTML表单的界面实现它。图19-1所示的就是在这个例子中我们将使用的HTML表单界面。
图 19-1 用于文件上载的HTML表单包含了与普通HTML表单不同的域和域类型正如你可以看到的,以上表单包含一个文本输入框,在这个输入框中,用户可以输入文件名,或者点击"Browse"按钮来浏览或寻找本地的有效文件。稍后我们将详细介绍如何实现它。
在输入文件名后,用户可以点击"Send File"按钮将文件上传到服务器,而服务器上的PHP脚本正等着处理它。
在进入文件上传的例子之前,需要注意的是,php.ini文件具有五个能够控制PHP如何处理文件上传的指令。这些指令和默认值及其相关描述如表19-1所示。
19.1.1 文件上传的HTML代码
为了实现文件上传功能,需要用到一些专门用于上传文件的HTML语法。上例表单的HTML源代码如程序清单19-1所示。
程序清单19-1 upload.html——上传文件的HTML表单
<html>
<head>
<title>Administration-upload new files</title>
</head>
<body>
<h1>Upload new news files</h1>
<form action="upload.php"method="post"enctype="multipart/form-data"/>
<p>
<input type="hidden"name="MAX_FILE_SIZE"/>
<label for="userfile">Upload a file:</label>
<input type="file"name="userfile"id="userfile"/>
<input type="submit"/>
</p>
</form>
</body>
</html>
请注意,该表单使用了POST方法。文件上传也可以使用为Netscape Composer和Amaya所支持的PUT方法。但是,这需要对该脚本进行修改,因为这两种浏览器不支持GET方法。
这个表单的其他特性包括:
■在<form>标记中,必须设置属性enctype="multipart/form-data",这样,服务器就可以知道上传的文件带有常规的表单信息。
■必须有一个可以设置上传文件最大长度的表单域。这是一个隐藏的域,如下所示:
<input type="hidden"name="MAX_FILE_SIZE">
请注意,MAX_FILE_SIZE表单域是可选的,该值也可以在服务器端设置。然而,如果在这个表单中使用,表单域的名称必须是MAX_FILE_SIZE。其值是允许人们上传文件的最大长度值(按字节计算)。在这里,我们将其设置为1 000 000B(几乎就是1MB)。针对你自己的应用程序,可以将该值设置为更大或更小。
■你需要指定文件类型,如下所示:
<input type="file"name="userfile"id="userfile"/>
可以为文件选择喜欢的任何名字,但必须记住,将在PHP接收脚本中使用这个名字来访问文件。
提示 在我们进一步实现该功能之前,必须注意有些PHP版本在文件上传的代码中存在安全漏洞。如果决定在产品服务器上使用文件上传功能,必须确定所使用的PHP是最新版本,而且要时刻注意PHP的补丁发布。
当然,这并不能妨碍使用这样一个有用的技术,但是应该非常小心所编写的代码,考虑限制用户对文件上传功能的使用,例如,只允许站点管理员和内容管理员使用该功能。