在用户上传一些文件之后,能够看到所上传的文件,并可以操作这些文件的内容对他们来说是非常必要的。PHP提供了一系列目录函数与文件系统函数,它们都是实现此功能的非常有用的工具。
19.2.1 从目录读取
首先,我们将实现一个能够浏览所上传文件的目录的脚本。在PHP中,浏览目录实际上是非常简单的。在程序清单19-3中,我们给出了能够实现此功能的示例脚本。
程序清单19-3 browsedir.php——能够列出上传文件的目录
<html>
<head>
<title>Browse Directories</title>
</head>
<body>
<h1>Browsing</h1>
<?php
$current_dir=/'/uploads//';
$dir=opendir($current_dir);
echo/"<p>Upload directory is$current_dir</p>/";
echo/'<p>Directory Listing:</p><ul>/';
while(false!==($file=readdir($dir)))
{
//strip out the two entries of.and..
if($file!=/"./"&&$file!=/"../")
{
echo/"<li>$file</li>/";
}
}
echo/'</ul>/';
closedir($dir);
?>
</body>
</html>
以上脚本使用了函数opendir、closedir和readdir。
函数opendir用于打开所浏览的目录。这类似于用函数fopen打开所读取的文件。只是传递给此函数的参数不是文件名称,而是一个目录名称:
$dir=opendir($current_dir);
该函数将返回一个目录句柄,这一点与函数fopen返回文件句柄是非常类似的。
在目录打开后,可以通过调用函数readdir($dir)从目录中读取文件,正如本例所示。当该目录中没有可读的文件时,此函数将返回false。请注意,当此函数读取一个名为“0”的文件时,也将返回false——为了确保这一点,可以通过测试来确定返回值是否为false。
while(false!==($file=readdir($dir)))
当完成从目录中读取文件的步骤后,可以通过调用函数closedir($dir)关闭该目录,这也类似于调用函数fclose来关闭文件。
图19-3所示的是目录浏览脚本的输出示例。
图 19-3 目录清单列出了指定目录中的所有文件通常,.(当前目录)和..(上一级)目录也会显示在图19-3所示的清单中。但是,我们使用了如下所示的语句将它们过滤了:
if($file!=/"./"&&$file!=/"../")
如果删除了这行代码,.(当前目录)和..(上一级)目录就会出现在目录清单中。
如果通过这种机制提供浏览目录的功能,那么限制可浏览的目录是很明智的,因为这样用户就不能够浏览特殊的目录列表。
在这里,一个相关的并且是非常实用的函数是rewinddir($dir),此函数将所读的文件恢复到开始的目录。
除了这些函数外,还可以使用PHP提供的dir类,该类具有handle和path属性,以及read、close和rewind方法,它们与以上所介绍的非类函数有着相同的作用。
在程序清单19-4中,我们使用dir类重新编写了以上示例。
程序清单19-4 browsedir2.php——使用dir类显示目录列表
<html>
<head>
<title>Browse Directories</title>
</head>
<body>
<h1>Browsing</h1>
<?php
$dir=dir(/"/uploads//");
echo/"<p>Handle is$dir->handle</p>/";
echo/"<p>Upload directory is$dir->path</p>/";
echo/'<p>Directory Listing:</p><ul>/';
while(false!==($file=$dir->read))
//strip out the two entries of.and..
if($file!=/"./"&&$file!=/"../")
{
echo/"<li>$file</li>/";
}
echo/'</ul>/';
$dir->close;
?>
</body>
</html>
以上示例中的文件名称并没有以任何顺序保存,因此如果需要一个有序列表,你可以使用scandir函数,该函数是在PHP 5中引入的。这个函数可以将文件名称保存在一个数组,并且以字母表的顺序排序,升序或降序,如程序清单19-5所示。
程序清单19-5 scardir.php——使用scandri函数对文件名称进行字母表方式排序
<html>
<head>
<title>Browse Directories</title>
</head>
<body>
<h1>Browsing</h1>
<?php
$dir=/'/uploads//';
$files1=scandir($dir);
$files2=scandir($dir,1);
echo/"<p>Upload directory is$dir</p>/";
echo/'<p>Directory Listing in alphabetical order,ascending:</p><ul>/';
foreach($files1 as$file)
{
if($file!=/"./"&&$file!=/"../")
echo/"<li>$file</li>/";
}
echo/'</ul>/';
echo/"<p>Upload directory is$dir</p>/";
echo/'<p>Directory Listing in alphabetical,descending:</p><ul>/';
foreach($files2 as$file)
{
if($file!=/"./"&&$file!=/"../")
echo/"<li>$file</li>/";
}
echo/'</ul>/';
?>
</body>
</html>