Synology-Forum.nl

Overige software => Web Station => Topic gestart door: stekkerjack op 04 januari 2009, 17:29:51

Titel: Een bestandenlijst laten maken.
Bericht door: stekkerjack op 04 januari 2009, 17:29:51
Op de server van mijn webhoster had ik de mogelijlheid een lijst van bestanden te laten maken (http://www.tinyurl.com/tidata (http://www.tinyurl.com/tidata)).
Op mijn Synology gaat dat helaas niet meer (http://92.108.8.42/TIDATA/ (http://92.108.8.42/TIDATA/))

Iemand een idee hoe ik dit op kan lossen?
Titel: Re: Een bestandenlijst laten maken.
Bericht door: Luit op 04 januari 2009, 18:47:58
misschien is het een idee om m.b.v. FTP een bestandenlijst te maken?

Luit
Titel: Re: Een bestandenlijst laten maken.
Bericht door: stekkerjack op 04 januari 2009, 19:11:42
Het idee was het zelfde te krijgen als op de oude server, de server maakt daarbij zelf zo'n lijst (zodat ik die niet iedere keer bij hoef te werken).

Is er echt geen mogelijkheid om dit de Synology zelf te laten doen?
Titel: Re: Een bestandenlijst laten maken.
Bericht door: wizjos op 04 januari 2009, 21:43:20
Hi stekkerjack,

Kijk een hier (http://vbeaud.free.fr/tools/scripts_en.html), hier staat een linux shell-script 'dir2html' waarmee je volgens mij precies datgene krijgt wat je hebben wilt....

Succes!

Wizjos
Titel: Re: Een bestandenlijst laten maken.
Bericht door: stekkerjack op 05 januari 2009, 08:34:01
Bedankt voor de tip, maar hoe installeer ik dat?
Titel: Re: Een bestandenlijst laten maken.
Bericht door: Plerry op 05 januari 2009, 12:13:33
Of, wanneer deze lijst dynamisch moet zijn, kan je dat zelf in PHP maken.
Je kan dan desgewenst ook een specifiek file-filter (bijv op file extensie) toevoegen.

Dat doe je bijv. zo:

In de kop van je PHP pagina zet je:
<?php
function findFiles($dir,$ext) {
$dirhandle opendir($dir);
while (false != ($file readdir($dirhandle)))
if (!is_dir("$dir/$file") && (substr($file,-strlen($ext))==$ext)) {
$foundfile['naam'&#93; = $file;
$foundfile['datum'&#93; = filemtime("$dir/$file");
$foundfile['grootte'&#93; = intval(filesize("$dir/$file")/1024);
$foundfiles[&#93; = $foundfile;
}
closedir($dirhandle);
return SortBy2ndIndex($foundfiles'naam'true);
}

function 
SortBy2ndIndex($multiArray$secondIndex$descending false) {
while (list($firstIndex, ) = each($multiArray))
$indexMap[$firstIndex&#93; = $multiArray[$firstIndex&#93;[$secondIndex&#93;;
$dummy $descending arsort($indexMap) : asort($indexMap);
while (list($firstIndex, ) = each($indexMap))
if (((int) $firstIndex)== $firstIndex)
$sortedArray[&#93; = $multiArray[$firstIndex&#93;;
else $sortedArray[$firstIndex&#93; = $multiArray[$firstIndex&#93;;
return $sortedArray;
}
?>
en in het HTML-body-deel van je PHP-file bijv.:
<table border="0" cellspacing="0" width="80%">
<tr><th>File</th>
<th>Datum</th>
<th>Link(s)</th>
</tr>
<?php
$dir '/volume1/web/regiobulletin';
$zip_list findFiles($dir,'&#46;zip');
for ($i=0$i<count($zip_list); $i++) {
$pdfName substr($zip_list[$i&#93;['naam'&#93;,0,-4)&#46;'&#46;pdf';
$pdfFile is_file("$dir/$pdfName") ? true false;
   $fileDate strftime("%d-%b-%Y"min($zip_list[$i&#93;['datum'&#93;,($pdfFile ? filemtime("$dir/$pdfName") : time()) ));
    echo '<tr align="center"'&#46;($i%2 ?  '' : ' bgcolor="#BBDDFF"')&#46;">nt";
echo '<td>Regiobulletin nr&#46; '&#46;substr($zip_list[$i&#93;['naam'&#93;,-6,2)&#46;"</td>nt";
echo "<td>$fileDate</td>nt";
echo '<td><a href="/regiobulletin/'&#46;$zip_list[$i&#93;['naam'&#93;&#46;"" title="ZIP">nt";
    echo '    <img border="0" src="/icoons/zip_sm&#46;gif" height="16" width="16" alt="ZIP"> ('&#46;$zip_list[$i&#93;['grootte'&#93;&#46;'kB)</a>';
    if ($pdfFile) {
     echo " &nbsp; nt    <a href="/regiobulletin/$pdfName" target="_blank" title="PDF">nt";
     echo '    <img border="0" src="/icoons/pdf_sm&#46;gif" height="16" width="16" alt="PDF"> ('&#46;intval(filesize("$dir/$pdfName")/1024)&#46;'kB)</a>';
    };
    echo "</td>n</tr>n";
 };
?>
</table>

Hier wordt in het HTML-body deel de bestandslocatie op je DS gespecificeerd ( $dir= ... )
Vervolgens wordt een file-array (naam, datum, grootte) gevuld van alle ZIP-files in die directory, en aflopend gesorteerd op file-naam.
Vervolgens wordt een HTML-tabel geschreven met file-omschrijving, -datum en -link, waarbij tevens een link beschikbaar gemaakt wordt
naar een PDF-file onder diezelfde file-naam (afgezien van extensie), indien beschikbaar.
De link bestaat uit een plaatje (ZIP of PDF)+ de file-groote (in kB).

Deze code was geschreven voor PHP3 en kan tegenwoordig wellicht iets simpeler met het "foreach" commando.
Maar de code werkt uiteraard nog steeds voor de huidige PHP-versies.

Uiteraard kan je naar behoefte aanpassen.

Plerry
Titel: Re: Een bestandenlijst laten maken.
Bericht door: wizjos op 05 januari 2009, 17:50:34
@Plerry en stekkerjack,

Mooi codevoorbeeldje, kon ik zelf ook wel gebruiken :mrgreen:
Heb 'm iets generieker gemaakt met een sorteringsmogelijkheid op naam, grootte en datum (afwisselend oplopend en aflopend):
Opslaan als dirlisting.php<?php
function findFiles($dir,$ext,$sort_on,$sort) {
$dirhandle opendir($dir);
while (false != ($file readdir($dirhandle)))
if (!is_dir("$dir/$file") ){
if ($ext == '&#46;*' || (substr($file,-strlen($ext))==$ext)) {
$foundfile['naam'&#93; = $file;
$foundfile['datum'&#93; = filemtime("$dir/$file");
$foundfile['grootte'&#93; = intval(filesize("$dir/$file")/1024);
$foundfiles[&#93; = $foundfile;
}
}
closedir($dirhandle);
return SortBy2ndIndex($foundfiles$sort_on$sort);
}
function 
SortBy2ndIndex($multiArray$secondIndex$descending false) {
while (list(
$firstIndex, ) = each($multiArray))
$indexMap[$firstIndex&#93; = $multiArray[$firstIndex&#93;[$secondIndex&#93;;
$dummy $descending arsort($indexMap) : asort($indexMap);
while (list($firstIndex, ) = each($indexMap))
if (((int) $firstIndex)== $firstIndex) {
$sortedArray[&#93; = $multiArray[$firstIndex&#93;;
} else {
$sortedArray[$firstIndex&#93; = $multiArray[$firstIndex&#93;;
}
return $sortedArray;
}
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<?php
/* de onderstaande 2 variabelen maken de zaak stuurbaar: 
- type bepaalt het soort bestand (bv&#46; &#46;zip, &#46;txt óf &#46;*)
- dir bepaalt het pad waar de bestanden staan die je wilt tonen
*/
$type '&#46;*';
$dir '/volume1/web';
$sort 1;
$sort_on 'naam';
if (
$_REQUEST['action'&#93; != '') {
   
if ($_REQUEST['action'&#93; == 'Datum') $sort_on = 'datum';
   
if ($_REQUEST['action'&#93; == 'Grootte') $sort_on = 'grootte';
}
if (
$_REQUEST['sort'&#93; != '') {
if ($_REQUEST['sort'&#93; == 1) {
$sort 0;
} else {
$sort 1;
}
}
echo 
'<title>Index van '&#46;$dir&#46;'</title>';
?>

</head>
<script>
function $(e) {return document.getElementById(e);}
</script>
<style>
body,input,td{font:11px Verdana}
.fieldset {
   height: 780px;
   width: auto;
}
</style>
<body>
<form name="Dirlisting" method="post" action="dirlisting.php">
<input type="hidden" id="action" name="action" value="">
<input type="hidden" id="sort" name="sort" value="<?php echo $sort ?>">
<table border="0" cellspacing="0" width="80%">
<tr>
 <th align="left">
  <input type="button" id="type" value="Bestandsnaam" onClick="$('action').value=this.value;submit();">&nbsp;
 </th>
 <th>
  <input type="button" id="type" value="Datum" onClick="$('action').value=this.value;submit();">&nbsp;
 </th>
 <th>
  <input type="button" id="type" value="Grootte" onClick="$('action').value=this.value;submit();">&nbsp;
 </th>
</tr>
<?php
$dir_list 
findFiles($dir,$type,$sort_on,$sort);
for (
$i=0$i<count($dir_list); $i++) {
$fileDate strftime("%d-%m-%Y",$dir_list[$i&#93;['datum'&#93;);
echo '<tr'&#46;($i%2 ?  '' : ' bgcolor="#BBDDFF"')&#46;">";
echo '<td><a href="'&#46;$dir_list[$i&#93;['naam'&#93;&#46;'">'&#46;$dir_list[$i&#93;['naam'&#93;&#46;"</a></td>";
echo "<td>"&#46;$fileDate&#46;"</td>nt";
echo '<td align="right ">'&#46;$dir_list[$i&#93;['grootte'&#93;&#46;' kb';
echo "</td>n</tr>n";
}
?>

</table>
</body>
</html>

Veel plezier er mee!

Groet,

Wizjos
Titel: Re: Een bestandenlijst laten maken.
Bericht door: Plerry op 06 januari 2009, 16:17:03
Mijn bovenstaande PHP-code was voor mijn specifieke geval.
Wizjos heeft die heel leuk meer generiek gemaakt.

Het kan nog generieker, door in de code van wizjos hierboven de volgende veranderingen aan te brengen.
$dir = ereg_replace("/[^/]*$",'',''.__FILE__) ;en
<form name="Dirlisting" method="post" action="<?php echo $_SERVER['PHP_SELF'&#93; ?>">misschien mag het "echo" nog weg in het laatse stukje code, maar dat weet ik niet zeker.

Je kan nu het aldus gewijzigde PHP bestand (bijv. als "index.php") in identieke vorm opslaan in iedere folder
waarvan je een bestand-listing beschikbaar wil maken.
De $dir-variable krijgt nu als waarde de pad-naam op je DS (t.o.v. de root) van de folder waarin het bewuste
PHP-bestand staat (bijv. "/volume1/web/mijnfolder").
Als action van het html-form roept het PHP bestand altijd weer zichzelf aan t.o.v. de root van je web-site,
waar het ook staat (in mijn voorbeeld dus met "/mijnfolder/index.php").

Wat nog toegevoegd zou kunnen worden is een optie om in de dir-listing alle web-pagina's
(*.htm, *.html, *.shtml, *.php, *.js, *.css + ???) uit de dir-listing te filteren.

Dit topic begint inmiddels overigens meer een PHP/HTML topic te worden dan een een Synology DS topic....

Plerry
Titel: Re: Een bestandenlijst laten maken.
Bericht door: wizjos op 06 januari 2009, 20:53:57
Plerry,

't Kan altijd beter :mrgreen:

Laten we inderdaad hier maar even stoppen... Ik denk dat aan de vraag meer dan voldaan is: je hebt gelijk dat het wel heel php wordt zo...
Straks durft men geen vraag meer te stellen, bang als men is dat er een complete academische verhandeling losbarst... :shock:  

Groet,

Wizjos