Synology-Forum.nl
Overige software => Web Station => Topic gestart 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?
-
misschien is het een idee om m.b.v. FTP een bestandenlijst te maken?
Luit
-
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?
-
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
-
Bedankt voor de tip, maar hoe installeer ik dat?
-
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'] = $file;
$foundfile['datum'] = filemtime("$dir/$file");
$foundfile['grootte'] = intval(filesize("$dir/$file")/1024);
$foundfiles[] = $foundfile;
}
closedir($dirhandle);
return SortBy2ndIndex($foundfiles, 'naam', true);
}
function SortBy2ndIndex($multiArray, $secondIndex, $descending = false) {
while (list($firstIndex, ) = each($multiArray))
$indexMap[$firstIndex] = $multiArray[$firstIndex][$secondIndex];
$dummy = $descending ? arsort($indexMap) : asort($indexMap);
while (list($firstIndex, ) = each($indexMap))
if (((int) $firstIndex)== $firstIndex)
$sortedArray[] = $multiArray[$firstIndex];
else $sortedArray[$firstIndex] = $multiArray[$firstIndex];
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,'.zip');
for ($i=0; $i<count($zip_list); $i++) {
$pdfName = substr($zip_list[$i]['naam'],0,-4).'.pdf';
$pdfFile = is_file("$dir/$pdfName") ? true : false;
$fileDate = strftime("%d-%b-%Y", min($zip_list[$i]['datum'],($pdfFile ? filemtime("$dir/$pdfName") : time()) ));
echo '<tr align="center"'.($i%2 ? '' : ' bgcolor="#BBDDFF"').">nt";
echo '<td>Regiobulletin nr. '.substr($zip_list[$i]['naam'],-6,2)."</td>nt";
echo "<td>$fileDate</td>nt";
echo '<td><a href="/regiobulletin/'.$zip_list[$i]['naam']."" title="ZIP">nt";
echo ' <img border="0" src="/icoons/zip_sm.gif" height="16" width="16" alt="ZIP"> ('.$zip_list[$i]['grootte'].'kB)</a>';
if ($pdfFile) {
echo " nt <a href="/regiobulletin/$pdfName" target="_blank" title="PDF">nt";
echo ' <img border="0" src="/icoons/pdf_sm.gif" height="16" width="16" alt="PDF"> ('.intval(filesize("$dir/$pdfName")/1024).'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
-
@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 == '.*' || (substr($file,-strlen($ext))==$ext)) {
$foundfile['naam'] = $file;
$foundfile['datum'] = filemtime("$dir/$file");
$foundfile['grootte'] = intval(filesize("$dir/$file")/1024);
$foundfiles[] = $foundfile;
}
}
closedir($dirhandle);
return SortBy2ndIndex($foundfiles, $sort_on, $sort);
}
function SortBy2ndIndex($multiArray, $secondIndex, $descending = false) {
while (list($firstIndex, ) = each($multiArray))
$indexMap[$firstIndex] = $multiArray[$firstIndex][$secondIndex];
$dummy = $descending ? arsort($indexMap) : asort($indexMap);
while (list($firstIndex, ) = each($indexMap))
if (((int) $firstIndex)== $firstIndex) {
$sortedArray[] = $multiArray[$firstIndex];
} else {
$sortedArray[$firstIndex] = $multiArray[$firstIndex];
}
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. .zip, .txt óf .*)
- dir bepaalt het pad waar de bestanden staan die je wilt tonen
*/
$type = '.*';
$dir = '/volume1/web';
$sort = 1;
$sort_on = 'naam';
if ($_REQUEST['action'] != '') {
if ($_REQUEST['action'] == 'Datum') $sort_on = 'datum';
if ($_REQUEST['action'] == 'Grootte') $sort_on = 'grootte';
}
if ($_REQUEST['sort'] != '') {
if ($_REQUEST['sort'] == 1) {
$sort = 0;
} else {
$sort = 1;
}
}
echo '<title>Index van '.$dir.'</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();">
</th>
<th>
<input type="button" id="type" value="Datum" onClick="$('action').value=this.value;submit();">
</th>
<th>
<input type="button" id="type" value="Grootte" onClick="$('action').value=this.value;submit();">
</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]['datum']);
echo '<tr'.($i%2 ? '' : ' bgcolor="#BBDDFF"').">";
echo '<td><a href="'.$dir_list[$i]['naam'].'">'.$dir_list[$i]['naam']."</a></td>";
echo "<td>".$fileDate."</td>nt";
echo '<td align="right ">'.$dir_list[$i]['grootte'].' kb';
echo "</td>n</tr>n";
}
?>
</table>
</body>
</html>
Veel plezier er mee!
Groet,
Wizjos
-
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'] ?>">
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
-
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