代码之家  ›  专栏  ›  技术社区  ›  ubiquibacon

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

  •  0
  • ubiquibacon  · 技术社区  · 14 年前

    我的任务经常是为我大学的教授们制作专业网站。最近,一位教授让我创建一个网站,除了指向文件的链接之外什么都没有。我告诉他这很容易,因为只要网站不包含索引,所有的文件链接都会自动显示(是的,我做了)。令我沮丧的是,大学服务器没有做到我期望他们做的事情,虽然我知道有可能实现这个网站的文件清单,但我没有权力这样做。

    我正在制作一个简单的PHP脚本,其中列出了文件和目录(以及它们相关的下载链接),但我想知道这样的东西是否已经存在,也许已经全部完善并准备好了。有没有人知道这样一个应用程序,我可以直接进入的地方?闪光是不需要的,但我会考虑一个简单的或漂亮的一个。

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

    我的服务器运行的是coldfusion7,0,2142559和php4.3.9

    6 回复  |  直到 14 年前
        1
  •  1
  •   Codemwnci    14 年前

    网上有很多例子。就我个人而言,我不会费心寻找一个库等,因为代码是相当小的实现。试试这个(我搜索过一个例子,但我以前用过)。

    // 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");
    
        2
  •  4
  •   Daniel Vandersluis    14 年前

    我知道你说你没有权限为教授的目录启用虚拟目录列表,但我的建议是与管理员交谈,谁可以打电话,让他们启用它。如果他们拒绝,复制该功能的机会将被拒绝 (不管发生了什么)。

        3
  •  2
  •   Your Common Sense    14 年前

    看见

    <?
    $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>
    
        4
  •  1
  •   Alin P.    14 年前

    你可以把这个放进索引.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));
    }
    

    当做, 阿林

        5
  •  1
  •   Jordan Reiter    14 年前

    另一个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>
    

    理论上,我认为你可以把这个代码放到应用程序.cfm文件位于要添加的任何目录的根目录下。然后,确保有一个空的索引.cfm文件,它应该为您创建索引。

        6
  •  1
  •   Sergey Galashyn    14 年前

    你还没有提到什么是你的网络服务器。如果是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>
    

    如果你愿意的话 复制web服务器列表功能--可以使用应用.cfc捕获嵌套文件夹中的请求而不复制索引.cfm

    请评论,我试试这个。