Map Directory weergeven en openen door te klikken
Ik wil een de directory van een map laten zien en dat men de bestanden in deze map kan opnenen door bv te dubbeklikken op de bestanden. het zijn vooral pdf en txt bestanden. Ik had al een script gevonden die de bestanden in de map weergeeft maar je kan ze niet opnenen
Code (php)
Wie kan me hierbij helpen?
mvg,
Geert B
Overigens lijkt $bestand me hier een toepasselijkere variabelenaam ...
En tenzij je speciale voorzieningen treft en de hele zwik in je publieke webdirectory zet, dan zijn al deze bestanden dus ook voor iedereen te benaderen. De vraag is of je dat wel wilt.
Was dit niet een standaard module in Apache? Dus als het zaak is dat je overal doorheen kunt bladeren, zou je deze module wellicht kunnen gebruiken onder bepaalde omstandigheden (oa indien je Apache gebruikt). Waarom zou je dit zelf opnieuw programmeren?
De bedoeling is dat ik bestanden in deze map plaats die voor de bezoekers toegankelijk zijn. Aangezien het over heelwat bestanden gaat lijkt het me zinvol een pagina te maken die de bestanden in deze map weergeeft en die de bezoekers kunnen openen! In principe maakt het niet uit hoe dit gemaakt/toegankelijk wordt gemaakt
Jammer genoeg lukt het met dit niet
1 print ("<a href="MAP/$bestanden">$bestanden</a><br>");
Weet iemand een oplossing hiervoor?
Thx
mvg,
Geert B
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$directory = "/MAP"; // misschien een slash ervoor?
if(is_dir($directory)) {
$d=opendir($directory);
while ($bestand=readdir($d)) {
$bnaam=$directory."/".$bestand;
if (is_file($bnaam)) {
print '<a href="'.$directory.'/'.$bestand.'">'.$bestand.'</a><br>';
}
}
} else {
echo "Dit is geen directory.";
}
closedir($d);
?>
$directory = "/MAP"; // misschien een slash ervoor?
if(is_dir($directory)) {
$d=opendir($directory);
while ($bestand=readdir($d)) {
$bnaam=$directory."/".$bestand;
if (is_file($bnaam)) {
print '<a href="'.$directory.'/'.$bestand.'">'.$bestand.'</a><br>';
}
}
} else {
echo "Dit is geen directory.";
}
closedir($d);
?>
Gewijzigd op 06/08/2020 11:00:32 door - Ariën -
Je zegt dat er een hoop bestanden zijn, misschien is het dan ook handig dat deze een prettige indeling hebben.
Moet er trouwens geen toevoeging !== false in dat while-statement? Als je een directory genaamd 0 hebt valideert het while-statement tot false, dit staat ook in de documentatie. De bovenstaande code zal dus niet altijd werken, en heeft ook geen voorzieningen voor subdirectories.
En dan zul je nog onderscheid moeten maken tussen het interne en het externe pad van het bestand. Het interne pad is hoe de webserver de bestanden intern benadert. Dit gebruik je als je de bestanden inventariseert/uitleest. Het externe pad is hoe de bestanden extern worden geserveerd via de website en hoe deze voor een eindgebruiker te benaderen zijn via een browser.
Je zou de huidige directory van het php-bestand kunnen gebruiken - getcwd() - om alle bestanden en directories uit te lezen, maar dan verschijnt het PHP-bestand ook in de lijst. En dan moet je bij de weergave nog specificeren hoe dit extern heet. In het onderstaande voorbeeld is dat voor mij '/phphulp/users/geertbuelens' maar dat zou je dus naar eigen smaak moeten aanpassen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
// voor debugging
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
// definitie
class MyDirectoryReader {
protected $root; // root van intern pad
protected $list; // lijst van bestanden en directories in volgorde van uitlezen
public function __construct($root) {
$this->root = $root;
$this->list = [];
}
public function readDir($relativePath=false, $depth=0) {
// we houden het relatieve pad ten opzichte van $this->root bij
if ($relativePath === false) {
$path = $this->root;
} else {
$path = $this->root.'/'.$relativePath;
}
if ($handle = opendir($path)) {
while (false !== ($entry = readdir($handle))) {
if (false === in_array($entry, array('.', '..'))) {
$isDir = is_dir($path.'/'.$entry);
// bouw de lijst en houd hierbij enkele kenmerken bij (de naam, het pad, de diepte in de structuur en of het een directory betreft)
$this->list[] = array(
'name' => $entry,
'path' => $relativePath,
'depth' => $depth,
'isdir' => $isDir,
);
if ($isDir) {
$this->readDir($relativePath.'/'.$entry, $depth+1);
}
}
}
} else {
throw new Exception($path.' is not a directory');
}
}
// voor het teruggeven van de rauwe data van de lijst
public function getList() {
return $this->list;
}
// voor het genereren van een (geneste) bulleted list
// je zult in de aanroep aan moeten geven hoe je de bestanden serveert via je webserver
public function getHtmlList($externalBase='') {
$currentDepth = 0;
foreach ($this->list as $data) {
// sluit eerdere niveau's?
while ($currentDepth > $data['depth']) {
echo '</ul></li>';
$currentDepth--;
}
if ($data['isdir']) {
// indien we een subdirectory ingaan, open een nieuwe bulleted list en verhoog diepte
?><li><b><?php echo $data['name']; ?></b><ul><?php
$currentDepth++;
} else {
?><li><a href="<?php echo $externalBase.$data['path'].'/'.$data['name']; ?>"><?php echo $data['name']; ?></a></li><?php
}
}
// sluit het restant geopende niveau's af
while ($currentDepth > 0) {
echo '</ul></li>';
$currentDepth--;
}
}
}
try {
$test = new MyDirectoryReader(getcwd()); // creatie met vermelding van startpunt (kan ook expliciet met intern pad)
$test->readDir(); // lees alles uit
// geef nette boom weer van alle bestanden
?><ul class="mylist"><?php
$test->getHtmlList('/phphulp/users/geertbuelens'); // extern pad aanpassen naar eigen smaak
?></ul><?php
} catch (Exception $e) {
echo $e->getMessage();
}
?>[end]
// voor debugging
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');
// definitie
class MyDirectoryReader {
protected $root; // root van intern pad
protected $list; // lijst van bestanden en directories in volgorde van uitlezen
public function __construct($root) {
$this->root = $root;
$this->list = [];
}
public function readDir($relativePath=false, $depth=0) {
// we houden het relatieve pad ten opzichte van $this->root bij
if ($relativePath === false) {
$path = $this->root;
} else {
$path = $this->root.'/'.$relativePath;
}
if ($handle = opendir($path)) {
while (false !== ($entry = readdir($handle))) {
if (false === in_array($entry, array('.', '..'))) {
$isDir = is_dir($path.'/'.$entry);
// bouw de lijst en houd hierbij enkele kenmerken bij (de naam, het pad, de diepte in de structuur en of het een directory betreft)
$this->list[] = array(
'name' => $entry,
'path' => $relativePath,
'depth' => $depth,
'isdir' => $isDir,
);
if ($isDir) {
$this->readDir($relativePath.'/'.$entry, $depth+1);
}
}
}
} else {
throw new Exception($path.' is not a directory');
}
}
// voor het teruggeven van de rauwe data van de lijst
public function getList() {
return $this->list;
}
// voor het genereren van een (geneste) bulleted list
// je zult in de aanroep aan moeten geven hoe je de bestanden serveert via je webserver
public function getHtmlList($externalBase='') {
$currentDepth = 0;
foreach ($this->list as $data) {
// sluit eerdere niveau's?
while ($currentDepth > $data['depth']) {
echo '</ul></li>';
$currentDepth--;
}
if ($data['isdir']) {
// indien we een subdirectory ingaan, open een nieuwe bulleted list en verhoog diepte
?><li><b><?php echo $data['name']; ?></b><ul><?php
$currentDepth++;
} else {
?><li><a href="<?php echo $externalBase.$data['path'].'/'.$data['name']; ?>"><?php echo $data['name']; ?></a></li><?php
}
}
// sluit het restant geopende niveau's af
while ($currentDepth > 0) {
echo '</ul></li>';
$currentDepth--;
}
}
}
try {
$test = new MyDirectoryReader(getcwd()); // creatie met vermelding van startpunt (kan ook expliciet met intern pad)
$test->readDir(); // lees alles uit
// geef nette boom weer van alle bestanden
?><ul class="mylist"><?php
$test->getHtmlList('/phphulp/users/geertbuelens'); // extern pad aanpassen naar eigen smaak
?></ul><?php
} catch (Exception $e) {
echo $e->getMessage();
}
?>[end]
Gewijzigd op 06/08/2020 17:33:18 door Thomas van den Heuvel