Map Directory weergeven en openen door te klikken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Geert Buelens

Geert Buelens

04/08/2020 17:11:28
Quote Anchor link
Hallo,

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$d
=opendir("MAP");
while ($bestanden=readdir($d) )
    {

    $bnaam="MAP/".$bestanden;
    if (is_file($bnaam) )
        {
print ("$bestanden<br>"); }
    }

closedir($d);
?>


Wie kan me hierbij helpen?

mvg,
Geert B
 
PHP hulp

PHP hulp

28/03/2024 19:44:59
 
Rob Doemaarwat

Rob Doemaarwat

04/08/2020 17:16:53
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
print ("<a href="MAP/$bestanden">$bestanden</a><br>");

Overigens lijkt $bestand me hier een toepasselijkere variabelenaam ...
 
Thomas van den Heuvel

Thomas van den Heuvel

04/08/2020 19:57:07
Quote Anchor link
Hangt ook een beetje van de waarde van "MAP" af. Als dit een directory is die buiten je webdirectory ligt, dan kun je deze bestanden niet rechtstreeks openen. Tenzij je misschien op een lokaal webservertje zit ofzo, maar dan zou je ook gewoon gebruik kunnen maken van je verkenner? :D

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?
 
Geert Buelens

Geert Buelens

06/08/2020 10:05:55
Quote Anchor link
Hallo,

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
 
- Ariën  -
Beheerder

- Ariën -

06/08/2020 10:58:52
Quote Anchor link
Even het script opgeschmuckt met een extra controle of het een directory is, en deze een vaste variabele gegeven. tevens even voorzien van variabelen buiten quotes om het netter te maken. En ook de variabelenbenaming aangepast.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>
Gewijzigd op 06/08/2020 11:00:32 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

06/08/2020 17:24:25
Quote Anchor link
Zijn er ook subdirectories / is er een directorystructuur?

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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]
Gewijzigd op 06/08/2020 17:33:18 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.