Как мне воспроизвести список функций каталога веб-сервера? - PullRequest
0 голосов
/ 04 октября 2010

Мне часто поручают создавать специальные сайты для профессоров в моем университете. Недавно профессор попросил меня создать сайт без ссылок на файлы. Я сказал ему, что это будет легко, потому что, пока на сайте нет индекса, все ссылки на файлы будут отображаться автоматически (да, я сделал). К моему ужасу, университетские серверы не делают то, что я от них ожидал, и хотя я знаю, что можно реализовать этот список файлов для данного веб-сайта, я не уполномочен это делать.

Я нахожусь в процессе создания простого PHP-скрипта, который перечисляет файлы и каталоги (и связанные с ними ссылки на скачивание), но мне интересно, существует ли что-то подобное, что, возможно, уже полностью отлажено и готово к работе. Кто-нибудь знает такое приложение, которое я могу просто поставить на место? Блеск не требуется, но я бы посоветовал простой или симпатичный.

О да, это должно быть в PHP или ColdFusion

Мой сервер работает под управлением ColdFusion 7,0,2,142559 и PHP 4.3.9

Ответы [ 6 ]

4 голосов
/ 04 октября 2010

Я знаю, что вы сказали, что у вас нет полномочий для включения списка виртуальных каталогов для каталога профессора, но я советую поговорить с администратором, который может сделать этот вызов, и попросить его включить его.Если они откажутся, скорее всего, будет воспроизведено, что функциональность будет отклонена по той же причине (что бы это ни было).

Это сэкономит ваше время в любом случае, потому что вы можете простопусть Apache (или любой другой веб-сервер) сделает то, что он легко может сделать, или вы не тратите время на создание чего-то, что вам придется убрать.

2 голосов
/ 04 октября 2010

см

<?
$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>
1 голос
/ 04 октября 2010

Другая версия 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, и он должен создать его для вас.

1 голос
/ 04 октября 2010

Вы не упомянули, какой у вас веб-сервер. В случае 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>

Вы можете легко изменить это, чтобы группировать файлы по каталогу (вложенные списки).

Если вы хотите true репликация функции листинга веб-сервера - возможно, можно использовать Application.cfc для перехвата запросов во вложенных папках без копирования index.cfm

Пожалуйста, прокомментируйте, и я попробую это.

1 голос
/ 04 октября 2010

В сети много примеров. Лично я не стал бы искать библиотеку и т. Д., Поскольку код довольно мал для реализации. Попробуйте это (пример, который я искал, но я использовал в прошлом).

// 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");
1 голос
/ 04 октября 2010

Вы можете поместить это в 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));
}

Не могу придумать ничего более простого, чем это.

С уважением, Alin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...