Volledige versie bekijken : Directory Listing



butskristof
3 January 2010, 18:59
Beste,

ik was gisteren aan het nadenken over hoe ik mijn documenten vanop iedere computer met internet kon bekijken.
Toen kwam ik op het idee van een FTP-server, maar hier heb je dan nog altijd een FTP programma voor nodig (tenzij je net2ftp gebruikt maar ik vind dit persoonlijk niet zo handig werken).
Is er geen manier waarop ik bv naar mijn webruimte surf, dan een wachtwoord moet ingeven, en dan in een map op mijn server terechtkom waarin bv mijn schooldocumenten staan?
Die eerste pagina waarop ik dan het wachtwoord moet ingeven heb ik al kunnen maken, kijk op http://kristofb.heliohost.org/. De manier waarmee ik het nu gedaan heb, is nog niet zo veilig, maar ik ben van plan van ook nog met .htacces en .htpasswd te werken aangezien mijn webserver dit ondersteund.
Maar hoe kan ik dan die pagina maken waarop ik in de map terechtkom? Ik heb al wat liggen googlen, en ik heb al enkele PHP-scripts gevonden. Het probleem is echter dat ik totaal geen ervaring heb met PHP ;s
Weet er iemand de manier om een pagina te maken waarop je toegang krijgt door de map en indien dit met PHP moet, kan iemand mij uitleggen hoe dit jusit werkt?
Mvg,
Kirstof.

butskristof
3 January 2010, 19:14
Voor het geval dat het kan helpen:
Ik kan gebruik maken van Adobe Dreamweaver CS3 als dat nodig is.
Mvg en dank bij voorbaat,
Kirstof.

Spoorzoeker
12 January 2010, 15:57
Lijkt me niet zo moeilijk:

upload elk document zodat je een link krijgt.
Zet deze link in een database.
Maak een log-in die daarna je database uitleest en je de downloadlinken toont.

ultddave
12 January 2010, 16:47
Is er geen manier waarop ik bv naar mijn webruimte surf, dan een wachtwoord moet ingeven, en dan in een map op mijn server terechtkom waarin bv mijn schooldocumenten staan?
Wat is het verschil met een FTP server dan? :P Daar moet je toch ook eerst inloggen en dan zie je ook je documenten staan. ;)

Hetgeen Spoorzoeker zegt kan inderdaad wel handig zijn. Maar ik zou dat gewoon zonder database doen. Gewoon een script schrijven dat elke submap van een map, bijvoorbeeld "uploads", gaat bekijken, en voor alle bestanden een downloadlink maakt. ;)



<?php

function showdirs($map = "./", $return = array())
{
if(@$dir = opendir($map))
{
while (false !== ($file = readdir($dir)))
{
if ($file != "." && $file != "..")
{
if(is_dir($map . $file))
{
$return[] = $file;
$return = showdirs($map . $file . "/", $return);
}
}
}
}
@closedir($dir);
return $return;
}

function file_extension($filename)
{
return end(explode(".", $filename));
}


function RemoveExtension($strName)
{
$ext = strrchr($strName, '.');

if($ext !== false)
{
$strName = substr($strName, 0, -strlen($ext));
}
return $strName;
}

$dirinhoud = showdirs('./uploads/');
foreach($dirinhoud as $dir)
{
$myDirectory = opendir("./uploads/".$dir."/");
echo "<h3>".$dir."</h3>";
while($entryName = readdir($myDirectory)) {
$dirArray[] = $entryName;
$naam = file_extension($entryName);
if(strlen($naam) > 1)
{
echo $entryName;
echo "<br/>";
}
}
}
?>


Bovenstaand script gaat dus alle submappen van "uploads" af. En gaat dan voor elke map, alle bestandsnamen uitprinten.

Stel dat je dit hebt;
./uploads/videos/filmpje.avi
./uploads/videos/filmpje1.avi
./uploads/videos/filmpje2.avi

Dan krijg je als output:

videos
filmpje.avi
filmpje1.avi
filmpje2.avi

Uiteraard moet er uiteindelijk een downloadlink komen ipv enkel de naam. ;)

Spoorzoekers manier gaat sneller werken aangezien hij bij mijn script, elke keer alle mappen gaat doorlopen. Terwijl bij hem de data al in de database zit. Afhankelijk van de hoeveelheid bestanden/mappen, kan je dus kiezen voor één van de 2 manieren. ;)

PS:
echo $entryName;
echo "<br/>";

moet je dan vervangen door de download link. $entryName bevat de bestandsnamen. Bijvoorbeeld "filmpje.avi". ;)

Mvg,
Dave

carl
12 January 2010, 18:47
En uiteindelijk worden je bestanden toch ook over FTP verzonden ?? Of zie ik het verkeerd :p

Spoorzoeker
12 January 2010, 19:14
Een downloadlink is toch geen FTP ?

butskristof
12 January 2010, 20:13
Oke dankjewel allemaal,
mijn excuses dat ik hier al even niet meer gereageerd heb. Ik ga nu het script van Ultdave uitproberen en ik zal jullie laten weten of het werkt.
Nogmaals hartelijk dank allemaal.
Mvg,
Kristof.

butskristof
12 January 2010, 20:38
Wat is het verschil met een FTP server dan? :P Daar moet je toch ook eerst inloggen en dan zie je ook je documenten staan. ;)

PS:
echo $entryName;
echo "<br/>";

moet je dan vervangen door de download link. $entryName bevat de bestandsnamen. Bijvoorbeeld "filmpje.avi". ;)

Beste, in mijn vorige post was ik dit vergeten. Als je het gewoon met een FTP-server doet heb je nog altijd een FTP-programma nodig, dit is toch niet vereist bij de andere manier? Ik kan namelijk op school zelf geen programma's installeren.

over het PS bericht:
Ik vrees dat ik het niet helemaal snap... Moet ik hier dan van maken om het bij jouw voorbeeld te noemen.
echo "filmpje.avi";
echo "filmpje1.avi";
echo "<br/>";
?
Met php heb ik dus duidelijk nog geen ervaringen :s...

PS:
ik heb het nu net uitgeprobeerd en het enige wat ik krijg is:

".$dir.""; while($entryName = readdir($myDirectory)) { $dirArray[] = $entryName; $naam = file_extension($entryName); if(strlen($naam) > 1) { echo $entryName; echo "
"; } } } ?>
Weet jij wat ik moet doen?
Hartelijk dank voor jullie hulp nogmaals.
Mvg,
Kristof.

ultddave
12 January 2010, 21:03
Neen. ;)

Ik vermoed dat ge ooit geprogrammeerd hebt in 1 of andere taal? ;)

Variabelen in PHP worden aangeduid met een dollarteken.

Dus $entryName is een variabele met naam entryName. In dit geval is die van het type "String" en bevat dus een bestandsnaam. (Eigenlijk heeft PHP niet echt expliciet verschillende types, maar ik gebruik het maar om het makkelijk uit te leggen :D) Het echo commando doet hetzelfde als "write" , "print" etc etc statements van andere programmeertalen. namelijk het uitschrijven van data. In dit geval schrijven we de waarde van de variabele entryName uit in de html code.

Bijvoorbeeld:


<html>
<head>
<title>Test</title>
</head>
<body>
<?php
$entryName = "Test";
echo "<p>".$entryName."</p>";
?>
</body>
</head>


Is hetzelfde als je dit zou doen (zonder PHP);



<html>
<head>
<title>Test</title>
</head>
<body>
<p>Test</p>
</body>
</head>


Mijn script gaat dus via een while lus, alle bestandsnamen uit een map halen. En elke bestandsnaam, 1 voor 1, in de variabele entryName stoppen. En die wordt dan elke keer uitgeschreven in dit geval. Dus dan krijg je een lijst van bestandsnamen. ;)

Dit is een volledig script;


<html>
<head>
<title> Test </title>
</head>
<body>
<?php

function showdirs($map = "./", $return = array())
{
if(@$dir = opendir($map))
{
while (false !== ($file = readdir($dir)))
{
if ($file != "." && $file != "..")
{
if(is_dir($map . $file))
{
$return[] = $file;
$return = showdirs($map . $file . "/", $return);
}
}
}
}
@closedir($dir);
return $return;
}

function file_extension($filename)
{
return end(explode(".", $filename));
}


function RemoveExtension($strName)
{
$ext = strrchr($strName, '.');

if($ext !== false)
{
$strName = substr($strName, 0, -strlen($ext));
}
return $strName;
}

$dirinhoud = showdirs('./uploads/');
foreach($dirinhoud as $dir)
{
$myDirectory = opendir("./uploads/".$dir."/");
echo "<h3>".$dir."</h3>";
while($entryName = readdir($myDirectory)) {
$dirArray[] = $entryName;
$naam = file_extension($entryName);
if(strlen($naam) > 1)
{
echo "<a href=\"download.php?download_file=".$dir."/".$entryName."\" >".$entryName."</a><br />";
}
}
}
?>
</body>
</html>
Deze code sla je op als "test.php" bijvoorbeeld :P.

Dan maak je een tweedde bestand en dat noem je "download.php" en daar steek je deze code in:


<?php
$path = $_SERVER['DOCUMENT_ROOT']."/uploads/";
$fullPath = $path.$_GET['download_file'];

if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
}
header("Content-length: $fsize");
header("Cache-control: private");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;
?>

Beide files plaats je dan in je "root" directory. Op een webserver is dat bijvoorbeeld HTTPdocs. En onder die root directory, maak je een subfolder (een map dus) aan genaamd "uploads".

En in die map moet je dan een submap plaatsen, bijvoorbeeld "videos". En in die submap moet je dan je videos plaatsen. Je echte bestanden dus.

Bestanden die rechtstreeks onder "uploads" staan, worden denk ik niet gezien als "bestand". Ze moeten dus effectief in een submap van "uploads" staan. Bijvoorbeeld videos, fotos, ...

Uiteraard kan je dat aanpassen in het script indien nodig :D.

PS: Denk eraan dat de server uiteraard PHP moet ondersteunen. Je kan dat dus niet lokaal testen op je PC zonder server. WAMP server (gratis) kan je bijvoorbeeld wel gebruiken om mijn script te testen. ;)

PS: Het is inderdaad niet de beste oplossing :D. Maar het werkt op mijn website, dus normaal gezien ook bij u. ;)

Voorbeeld; http://www.latemar.be/test.php
(Bij muziek en videofiles moet je waarschijnlijk rechts klikken en "doel opslaan als " kiezen. Anders zal hij die niet downloaden, maar streamen naar je mediaplayer ofzo :D.)

Mvg,
Dave

butskristof
12 January 2010, 21:39
@ultddave;
Hartelijk bedankt!
Na nog wat geprobeerd te hebben is het me gelukt om alles te laten werken!
Heel erg bedankt!
Mvg,
Kristof.