如何复制Web服务器的目录列表功能?

时间:2010-10-04 17:22:54

标签: php html coldfusion indexing

我经常负责为我大学的教授制作专业网站。最近一位教授让我创建一个除了文件链接之外什么都没有的网站。我告诉他这很容易,因为只要网站没有包含索引,所有文件链接都会自动显示(是的,我做过)。令我沮丧的是,大学服务器并没有按照我的预期去做,虽然我知道有可能为这个网站实现这个文件列表,但我没有权限这样做。

我正在制作一个简单的PHP脚本,列出文件和目录(及其相关的下载链接),但我想知道这样的事情是否已经存在,或许已经全部完善并准备好了。有谁知道我可以放到这样的应用程序?闪光不是必需的,但我会考虑一个简单的或漂亮的。

哦,是的,它需要在PHP或ColdFusion中

我的服务器正在运行ColdFusion 7,0,2,142559和PHP 4.3.9

6 个答案:

答案 0 :(得分:4)

我知道您说您没有权限为教授的目录启用虚拟目录列表,但我的建议是与可以拨打该电话并要求他们启用该电话的管理员交谈。如果他们拒绝,很可能会复制该功能将被拒绝同样的原因(无论发生什么情况)。

它可以节省你的时间,因为要么你可以让Apache(或任何网络服务器)做它容易做到的事情,要么你不浪费时间去构建一些你必须要删除的东西。 / p>

答案 1 :(得分:2)

<?
$dirArray = glob("*");
?>
<table border=1 cellpadding=5 cellspacing=0 class=whitelinks>
 <tr>
  <th>Filename</TH><th>Filetype</th><th>Filesize</th>
 </tr>
<? foreach ($dirArray as $file): ?>
 <tr>
  <td><a href="<?=$file?>"><?=$file?></a></td>
  <td><?=filetype($file)?></td>
  <td><?=filesize($file)?></td>
 </tr>
<? endforeach ?>
</table>

答案 2 :(得分:1)

您可以将它放在所需文件夹中的index.php中。

function outputRow($relPath, $isDir = false){
        // you could do something special for directories //
        echo '<a href="'.$relPath.'">'.$relPath.'</a>';
}

$dirPath = dirname(__FILE__);
$fileList = scandir( $dirPath );

foreach($fileList as $file){
    if($file == '.' || $file == 'index.php')
        continue 1;

    outputRow($file, is_dir($dirPath.'/'.$file));
}

想不出比这更简单的东西。

此致 阿林

答案 3 :(得分:1)

网上有很多例子。就个人而言,我不打算找到一个库等,因为代码实现起来很小。试试这个(我搜索过的一个例子,但我过去曾经使用过)。

// open this directory 
$myDirectory = opendir(".");

// get each entry
while($entryName = readdir($myDirectory)) {
    $dirArray[] = $entryName;
}

// close directory
closedir($myDirectory);

//  count elements in array
$indexCount = count($dirArray);
Print ("$indexCount files<br>\n");

// sort 'em
sort($dirArray);

// print 'em
print("<TABLE border=1 cellpadding=5 cellspacing=0 class=whitelinks>\n");
print("<TR><TH>Filename</TH><th>Filetype</th><th>Filesize</th></TR>\n");
// loop through the array of files and print them all
for($index=0; $index < $indexCount; $index++) {
        if (substr("$dirArray[$index]", 0, 1) != "."){ // don't list hidden files
        print("<TR><TD><a href=\"$dirArray[$index]\">$dirArray[$index]</a></td>");
        print("<td>");
        print(filetype($dirArray[$index]));
        print("</td>");
        print("<td>");
        print(filesize($dirArray[$index]));
        print("</td>");
        print("</TR>\n");
    }
}
print("</TABLE>\n");

答案 4 :(得分:1)

您还没有提到您的网络服务器是什么。如果是Apache,您可以将.htaccess文件与Options +Indexes放在一起,然后就完成了。

任何方式,非常快速和非常简单(以前我称之为脏,这不是真正的 :) CFML中的解决方案(假设这是index.cfm文件):

<!--- read all files recursively --->
<cfdirectory action="list" directory="#ExpandPath('.')#" name="qListDirectory" recurse="true" sort="directory ASC, name ASC" type="file" />

<!--- these paths used for building clean related-path links --->
<cfset baseURL = GetDirectoryFromPath(cgi.SCRIPT_NAME) />
<cfset basePath = GetDirectoryFromPath(cgi.PATH_TRANSLATED) />

<!--- list all files with directories except special and hidden --->
<cfoutput>
<ul>
<cfloop query="qListDirectory">
    <cfif NOT ListFind("index.cfm,Application.cfm,Application.cfc", qListDirectory.name) AND Left(qListDirectory.name,1) NEQ ".">
        <cfset thisPath = ReplaceNoCase(qListDirectory.directory, basePath, "") />
        <li><a href="#baseURL##thisPath#/#HTMLEditFormat(qListDirectory.name)#">#thisPath#/#HTMLEditFormat(qListDirectory.name)#</a></li>
    </cfif>
</cfloop>
</ul>
</cfoutput>

您可以轻松地将其修改为按目录(嵌套列表)对文件进行分组。

如果您想要真实复制网络服务器列表功能 - 可以使用Application.cfc来捕获嵌套文件夹中的请求,而无需复制index.cfm

请发表评论,我会试一试。

答案 5 :(得分:1)

另一个ColdFusion版本,这个版本列出了大小和日期修改(就像目录索引一样):

<!--- index.cfm, put into directory --->
<cffunction name="PrettySize" output="false">
    <cfargument name="size" type="Numeric">
    <cfif arguments.size GT 1048576>
        <cfreturn Fix(arguments.size/104857.6)/10 & ' MB'>
    <cfelseif arguments.size GT 1024>
        <cfreturn Fix(arguments.size/10.24)/100 & ' KB'>
    <cfelse>
        <cfreturn arguments.size & ' bytes'>
    </cfif>
</cffunction>
<cfdirectory action="list" directory="#GetDirectoryFromPath(ExpandPath("./"))#" name="Files">
<table>
    <thead>
        <tr>
        <td>Name</td>
        <td>Last Modified</td>
        <td>Size</td>
        </tr>
    </thead>
    <tbody>
        <cfoutput query="Files"><cfif Files.Name NEQ 'index.cfm'>
        <tr>
        <td><a href="./#Files.Name#">#Files.Name#</a></td>
        <td>#DateFormat(Files.DateLastModified)# #TimeFormat(Files.DateLastModified)#</td>
        <td>#PrettySize(Files.Size)#</td>
        </tr>
        </cfif></cfoutput>
    </tbody>
</table>

理论上,我认为您可以将此代码放入要添加的任何目录的根目录下的Application.cfm文件中。然后,只需确保每个目录中都有一个空的index.cfm文件,你想要一个索引,它应该为你创建它。