Tiedostolistaaja, jossa on pieniä lisäominaisuuksia: tiedostojen ja hakemistojen poistaminen, piilottaminen (myös RexExpeillä) ja lukemisen esto. Lisäksi puukuvain-toiminto, joka näyttää kerralla myös kaikki alihakemistot tiedostoineen.
Tämä versio tarvitsee JavaScript-tuen esteettisistä syistä, mutta kaikki oikeastaan toimii ilmankin. Puukuvain ei toimi ilman JavaScriptia.
Koodi on PHP:tä, XHTML:ää ja CSS:ää sekä JavaScriptiä ja toimii myös Internet Explorer 6:lla.
CSS ja funktiot erillisissä tiedostoissa lukemisen helpottamiseksi.
Näytettävä hakemisto annetaan otsikkorivillä pistämällä osoitteen perään ?dir=POLKU. browser.php:n alusta voi muuttaa muutamia asetuksia. Listaaja pitää pistää sivutilan juureen. Admin-tilassa näytetään myös piilotetut tiedostot ja kaikkiin hakemistoihin pääsee.
Screenshotteja ja tarvittavat filut:
browser.php (päätiedosto)
<?php /* Asetukset */ $admin_password = "passu tähän"; // Admin-salasana $iconset = "content/iconset"; // Kuvakesetin polku $kuvaus = 1; // Luetaanko määrätyistä tiedostoista Kuvaus-kenttään viimeinen rivi (1 = päällä, 0 = pois päältä) $loginTime = 120; // Kuinka kauan admin-keksi on voimassa sekunteina // Määritteet, joiden mukaan hakemistoja tai tiedostoja piilotetaan (REGEXP) $hide = array ( ".prv$", //.prv-päätteiset "^_", // Merkillä _ alkavat "~$", // Aaltoviivaan loppuvat ); // Määritteet, joiden mukaan tiedostoista luetaan viimeinen rivi Kuvaus-kenttään (pelkkä ARRAY) // Suoritetaan vain, jos $kuvaus:n arvo on 1 $info = array ( ".php", // .php-loppuiset ".txt", ".html", ); // Hakemistot, joihin pääsy evätään, ilman alun ja lopun kenoviivaa $f_dirs = array ( "salasanat", "salaista", ); // Virheilmoitukset $errors = array ( 1 => "Polkua ei annettu", // Jos $_GET['p']:llä ei ole arvoa 2 => "Ei oikeuksia hakemistoon", // Jos käyttäjä yrittää päästä kiellettyyn hakemiston ); // Tiedostojen prosessointiin tarvittavat funktiot include ("del-files.func"); include ("trimFileSize.f"); include ("getProperties.f"); if (!empty ($_POST['action'])) { if ($_POST['action'] == "login" && $_POST['password'] == $admin_password) setcookie ("browserAdmin", time(), time () + $loginTime); elseif ($_POST['action'] == "remove-files" && isset ($_COOKIE['browserAdmin'])) { foreach ($_POST['f'] as $x) { if (!file_exists ($x)) exit ("Tiedostoa/ hakemistoa $x ei ole olemassa!"); elseif (is_dir ($x)) { delFiles ($x); rmdir ($x); } else unlink ($x); } } @exit (header ("Location: /" . rtrim ($_POST['dir'], "/") . "/")); } elseif (isset ($_GET['treeview'])) exit (include ("dirtree.php")); function microtime_float () { list ($usec, $sec) = explode (" ", microtime ()); return ((float)$usec + (float)$sec); } $time_start = microtime_float (); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html> <head> <title>Polku: /<?php echo @rtrim ($_GET['dir'], "/"); ?>/</title> <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" /> <link href="/browser.css" type="text/css" rel="stylesheet" /> <script type="text/javascript"> time = <?php echo ((@$cookie = $_COOKIE['browserAdmin']) ? $cookie - time() + $loginTime : 0); ?>; login = 0; function countDown() { if (time > 0) { if (!login) { document.getElementById('login-button').style.display = "none"; document.getElementById('del-wrap').style.display = "block"; login = 1; } document.getElementById('timer').value = time--; setTimeout ("countDown()", 1000); } else { document.getElementById('login-button').style.display = "block"; document.getElementById('del-wrap').style.display = "none"; login = 0; } } </script> </head> <body onload="countDown()"> <div id="sidebar"> <input id="login-button" type="button" value="Login" onclick="document.getElementById('login').style.display='block'" /> <div id="del-wrap"> <input type="button" value="Poista" onclick="document.getElementById('remove').submit()" /> <label>Logout:</label> <input type="text" id="timer" /> </div> <a href="<?php echo "{$_SERVER['PHP_SELF']}?dir=" . rtrim ($_GET['dir'], "/"); ?>&treeview">Treeview</a> </div> <form id="login" action="/<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> <div> <input type="hidden" name="action" value="login" /> <input type="hidden" name="dir" value="<?php echo rtrim ($_GET['dir'], "/") . "/"; ?>" /> <input type="password" name="password" /> <input type="submit" value="Login" /> <input type="button" value="Peruuta" onclick="document.getElementById('login').style.display='none'" /> </div> </form> <form id="remove" action="/browser.php" method="post"> <table id="body"> <tr class="hilit"> <td class="icon"><input type="hidden" name="action" value="remove-files" /> <input type="hidden" name="dir" value="<?php echo rtrim ($_GET['dir'], "/") . "/"; ?>" /></td> <td class="nimi">Nimi</td> <td class="koko">Koko</td> <td class="kuvaus">Kuvaus</td> <?php if (isset ($_COOKIE['dirlistAdmin'])) { echo "<td class=\"admin\"></td>"; $admin = 1; } else $admin = 0; ?> </tr> <?php /* --------------------------------------------------- */ /* Varsinainen koodi alkaa */ /* --------------------------------------------------- */ @$dir = rtrim ($_GET['dir'], "/"); if (@empty ($_GET['dir'])) $error = 1; elseif (empty ($_COOKIE['browserAdmin']) && in_array ($dir, $f_dirs)) $error = 2; else $error = 0; if ($error != 0) echo "<tr><td id=\"notice\" colspan=\"5\">$errors[$error]</td></tr>\n"; else { if (strpos ($dir, "/")) echo "<tr><td></td><td class=\"nimi\"><a href=\"/" . substr ($dir, 0, strrpos ($dir, "/")) . "\">(Ylempi taso)</a></td><td></td><td></td><td></td></tr>\n"; $kohteet = glob ("$dir/*"); $files = $dirs = $total_size = 0; // Suolletaan hakemistot foreach ($kohteet as $i => $kohde) { if (is_dir ($kohde)) { $nimi = substr (strrchr ($kohde, "/"), 1); $tiedot = getProperties ($kohde, $hide, 0,0,0); if ($tiedot['show']) { echo "<tr><td><img src=\"/$iconset/dir.gif\" alt=\"DIR\" /></td><td class=\"nimi\"><a href=\"?dir=$kohde\">$nimi</a></td><td></td><td></td><td>" . (isset ($_COOKIE['browserAdmin']) ? "<input type=\"checkbox\" name=\"f[$i]\" value=\"$kohde\" />" : "") . "</td></tr>\n"; $dirs++; } unset ($kohteet[$i]); } } reset ($kohteet); // Käsitellään tiedostot $tyypit = file ("$iconset/doctypes.f"); $f = array ("<!--", "-->"); foreach ($kohteet as $i => $kohde) { $nimi = substr (strrchr ($kohde, "/"), 1); $tiedot = getProperties ($kohde, $hide, $info, $tyypit, $kuvaus); if ($tiedot['show']) { echo "<tr><td><img src=\"/$iconset/{$tiedot['icon']}\" alt=\"{$tiedot['laji']}\" /></td><td class=\"nimi\"><a href=\"/$kohde\">$nimi</a></td><td class=\"koko\">{$tiedot['koko']}</td><td>" . (($tiedot['kuvaus']) ? htmlentities (str_replace ($f, "", trim (end (file ($kohde)))), ENT_QUOTES, "UTF-8") : "") . "</td><td>" . ((isset ($_COOKIE['browserAdmin'])) ? "<input type=\"checkbox\" name=\"f[$i]\" value=\"$kohde\" />" : "") . "</td></tr>\n"; $files++; $total_size += $tiedot['bytes']; } } $time_end = microtime_float (); $time = round ($time_end - $time_start, 3); $total_size = trimFileSize ($total_size); if (!$files && !$dirs) echo "<tr><td id=\"notice\" colspan=\"5\">Ei tiedostoja</td></tr>\n"; echo "<tr id=\"bottom-bar\"><td colspan=\"5\">Polku: <span>/{$dir}/</span> Hakemistoja: <span>$dirs</span> Tiedostoja: <span>$files</span> Yhteiskoko: <span>$total_size</span> Aikaa meni: <span>$time s</span></td></tr>\n"; } ?> </table> </form> </body> </html>
doctypes.f
ESIMERKKI:
pic_name: filetype1, filetype2,
Voit lisätä omia tiedostotyyppejä ja -päätteitä listan loppuun:
zip: rar, zip, jar, php: html, htm, php, image: png, gif, jpeg, bmp, jpg, svg, sound: wav, wma, ogg, mp3, midi, video: avi, mpg, mpeg, wmv, text: txt, f, css, exec: exe, com, bat,
dirtree.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html> <head> <title>Treeview | <?php echo $_GET['dir']; ?></title> <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" /> <style type="text/css"> body { background: white; color: black; font: 12px tahoma, serif; } a { color: blue; text-decoration: none; } a:hover { color: red; } #root { margin-left: 30px; } ul { list-style-position: inside; padding: 0px; margin-left: 10px; } li { list-style: none; padding-top: 0px; padding-bottom: 4px; padding-left: 10px; float: left; clear: both; } ul > li { list-style: none; padding-left: 20px; } .directory { background: url(<?php echo "$iconset"; ?>/m_dir.gif) top left no-repeat; } .unknown { background: url(<?php echo "$iconset"; ?>/m_unknown.gif) top left no-repeat; } <?php $i = 5; $doctypes = file ("$iconset/doctypes.f"); while ($i < count ($doctypes)) { $type = strtolower (substr ($doctypes[$i], 0, strpos ($doctypes[$i], ":"))); echo "\t.$type {\n\tbackground: url({$iconset}/m_{$type}.gif) top left no-repeat;\n\t}\n"; $i++; } ?> .empty { color: #bbb; margin-left: 15px; padding-left: 0px; font-style: italic; list-style-type: disc; } #root li ul { display: none; } </style> <script src="dirtree.js" type="text/javascript"></script> </head> <body onload="opened = new Array();" onclick="listHover(event);"> <p><input type="text" id="infobar" style="width: 100%" value="Klikkaa kansioiden kuvakkeita avataksesi hakemiston" /></p> <p><a href="<?php echo $_GET['dir']; ?>">Kansionäkymä</a></p> <ul id="root"> <?php function scanDir ($directory, $id) { $inside = glob ("$directory/*"); $contents = array (); foreach ($inside as $key => $selection) { if (is_file ($selection)) { $contents[count ($contents)] = $selection; unset ($inside[$key]); } } foreach ($inside as $selection) $contents [count ($contents)] = $selection; unset ($inside); if (strpos ($_GET['dir'], "/")) { $upperdir = substr ($_GET['dir'], 0, strrpos ($_GET['dir'], "/")); echo "<li><a href=\"?dir=$upperdir&treeview\">..</a></li>\n"; } $file_check = false; if (count ($contents) !== 0) { $x = 0; $file_check = false; while ($x < count ($contents)) { $single = substr (strrchr ($contents[$x], "/"), 1); $end = substr (strrchr ($single, "."), 1); if ($single{0} != "_" && $end != "prv") { $file_check = true; if (is_file ($contents[$x])) { $s = 5; $file_found = false; $iconset = "content/iconset"; $file_types = file ("$iconset/doctypes.f"); while ($s < count ($file_types)) { $list = explode (":", $file_types[$s]); if (strpos ($list[1], " " . $end . ",") !== false) { $class = $list[0]; $file_found = true; break; } $s++; } if (!$file_found) $class = "unknown"; echo "<li id=\"i_$single\" class=\"$class\"><a href=\"$contents[$x]\">$single</a>"; } else { echo "<li id=\"i_$single\" class=\"directory\"><a href=\"?dir=$contents[$x]\">$single</a><ul>"; $id = scanDir ($contents[$x], $id + 1); echo "</ul>"; } $id++; echo "</li>\n"; } $x++; } } else $id++; if (!$file_check) echo "<li class=\"empty\">Empty</li>\n"; return $id; } if (isset ($_GET['dir']) && file_exists ($_GET['dir']) && is_dir ($_GET['dir'])) scanDir ($_GET['dir'], 1); else exit ("Directory doesn't exist!"); ?> <!-- #ROOT LOPPUU --> </ul> </body> </html>
Jos salasana on kiinteänä itse skriptassa, ei sitä tarvi cryptata. Ja kaksikertoinen cryptaaminen vaan nostaa collisioneiden mahdollisuuden.
Edit: Äh, ymmärsin väärin. Sinne alkuun kirjotetaan hashi, juu juu, mutta silti tuplahashaaminen on turhaa.
Juu no se md5() nyt vaan oli unohtunu sinne, kun alunperinkin lisäsin sinne, että jos jaan koodia jonneki muualle, niin en vahingossa jaa salasanaani mukana, kun aina joskus pääsee unohtumaan.
Päivitin samalla tuon koodin, ja nyt listaaja osaa järjestellä tiedostot (ei hakemistoja) nimen, koon ja tyypin perusteella, ja pikkusen muokkasin vähän nopeemmaks.
Eppapöhö :( miks kopioit mun nikin
Päivitin tätä
Hieno ainakin screenshotien perusteella!
**tap tap**
Logatessa sisään tämä ohjaa "http://browser.php/" -osoitteeseen, eli unohtaa domainin :(
Aihe on jo aika vanha, joten et voi enää vastata siihen.