Anzeige

Auslesen von Verzeichnissen... und anschließend mit Editor verlinken


loddarmattheus

Erfahrenes Mitglied
#1
Hallo Leute,
wieder mal ein Problem: Folgendes Script liest mir korrekt das Verzeichnis aus und listet mir alle *.txt Dateien in dem Verzeichnis auf. Wie muss ich den Link programmieren, dass ich beim Klick auf den jeweiligen Link entweder gleich die txt mit dem Editor geöffnet bekomme oder zumindest gefragt werde, mit welchem Programm ich die Datei angezeigt bekommen möchte?

Wenn man jetzt auf den txt-Link klickt, meint der Browser, "Firefox weiß nicht, wie diese Adresse geöffnet werden soll, da eines der folgenden (d) kein registriertes Protokoll oder in diesem Kontext nicht erlaubt ist."

PHP:
<?php
error_reporting(0);

$verzeichnis = "D:/xampp/htdocs/test/"; // Auszulesendes Verzeichnis
$sortierung = "1"; // Sortierung ("0"=A-Z, "1"=Z-A)
$extension = "txt"; // Gewünschte Dateiendung

$dateien = scandir($verzeichnis, $sortierung);
 foreach ($dateien as $datei)
  {
  $fileinfos = pathinfo($verzeichnis."/".$datei);
  $filesize = ceil(filesize($verzeichnis."/".$datei)/1024);

  if ($datei != "." && $datei != ".." && $fileinfos['basename'])
  {
  $dateitypen= array("$extension");
  if(in_array($fileinfos['extension'],$dateitypen))
  {
 unset($datei);
?>
<li><div><a href="<?php echo $fileinfos['dirname']."/".$fileinfos['basename'];?>" target="_blank"><?php echo $fileinfos['filename']; ?></a> (<?php echo $fileinfos['extension']; ?> | <?php echo $filesize ; ?>kb)</div></li>
<?php
  };
 };
};
?>
Auf dieser Webseite (http://demo.sevenx.de/folder2view/m...true&lightbox[width]=680&lightbox[height]=480) gibt es ein Demo (nicht von mir), wo man dies beim Klick auf das *.doc gut erkennen kann.
 

merzi86

Erfahrenes Mitglied
#2
Hallo loddar,
dein "Fehler" ist, dass du mit einen absoluten Pfad arbeitest, sobald das nur ein relativer ist wird vom Browser auch der Link ordentlich zusammen gebaut. So haben die auf der Demo Seite das bestimmt auch gemacht.

Allerdings kommt bei txt-Dateien von keinen bzw. fast keinen Browser ein Download-Dialog, da die Browser die txt-Dateien anzeigen können.

Die kannst du umgehen, indem du ein Download erzwingst. Dies kannst du mit der Header Funktion erzwingen.
Dies könnte z.B. so aussehen:

PHP:
<?php
error_reporting (0);

$verzeichnis = "test/"; // Auszulesendes Verzeichnis
$sortierung = 1; // Sortierung ("0"=A-Z, "1"=Z-A)
$extension = "txt"; // Gewünschte Dateiendung

if( isset($_GET['file']) && mb_strlen( trim( $_GET['file'] ) ) > 0 ) {
    if( !file_exists( sprintf( "%s%s.%s", $verzeichnis, $_GET['file'], $extension ) ) ) {
        echo sprintf("file '%s.%s' not found!", $_GET['file'], $extension );
    } else {
    echo "perform downliad";
        header('Content-Description: File Transfer');
        header('Content-Type: text/plain');
        header(sprintf('Content-Disposition: attachment; filename="%s.%s"', $_GET['file'], $extension ));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header( sprintf( 'Content-Length: %s', filesize(sprintf( "%s.%s", $verzeichnis . $_GET['file'], $extension ) ) ) );
        echo readfile( sprintf( "%s.%s", $verzeichnis . $_GET['file'], $extension ) );
    
    }

}

$dateien = scandir($verzeichnis, $sortierung);
 foreach ($dateien as $datei)
  {
  $fileinfos = pathinfo($verzeichnis."/".$datei);
  $filesize = ceil(filesize($verzeichnis."/".$datei)/1024);

  if ($datei != "." && $datei != ".." && $fileinfos['basename'])
  {
  $dateitypen= array("$extension");
  if(in_array($fileinfos['extension'],$dateitypen))
  {
 unset($datei);

    print "<li><div>";
    printf( '<a href="?file=%s">%s</a> (%s | %s kb)', $fileinfos['filename'], $fileinfos['filename'], $fileinfos['extension'], $filesize );
    print "</div></li>";

  };
 };
};
?>
Das ist so nicht unbedingt 100% sicher, aber das fängt so schon einige Angriffe ab.

BTW: du setzt die Sortierreihenfolge als String, allerdings erwartet scandir ein Integer. Das Funktion zwar bei PHP bis PHP 7 leider ohne Probleme, da PHP nicht zu 100% Typensicher ist. Spätestens wenn du mit PHP 7 aber strict_types = 1 deklarierst wird dir so etwas aber unter Umständen zum Verhängnis.
Also ein kleiner Tip gebe dir schon etwas mühe Variablen richtig zu befüllen das spart dir später vielleicht ein paar graue Haare.
Für die PHP hat auch intern ein paar Vordefinierte Konstanten für diese Arbeit. Du kannst diese hier finden: http://php.net/manual/de/dir.constants.php .
 
Anzeige

Neue Beiträge

Anzeige