patrick123: Hyperlink setzen Verkettete Auswahllisten

Hey, leute, ausgangspunkt ist dieser Hilfreiche Beitrag hilfreich - Verkettete Auswahllisten

Nun würde ich gerne herausfinden, wie es möglich ist, wenn der Nutzer in der dritten Auswahlliste ein Eintrag anklickt, dass er dann direkt eine Datei downloaden kann.
Ich denke die entscheidende Zeile lässt sich hier finden:

   var output = '<h3>Gewählte Strecke:<'+'/h3><h4>IDs der Auswahllisten<'+'/h4><p>' + sel +  
           '<'+'/p><h4>Werte der gewählten Optionen<'+'/h4><p>' + val +  
           '<'+'/p><h4>Texte (Namen) der gewählten Optionen<'+'/h4><p>' + txt + '<'+'/p>';

Denn in der dritten Zeile gibt er mir den zuletzt ausgewählten Wert wieder, aber leider ist es Statisch.

Leider bin ich kein JS-Kenner und hoffe einfach mal auf die Köpfe von hier. :)

Lg Patrick

  1. Moin,

    Leider bin ich kein JS-Kenner und hoffe einfach mal auf die Köpfe von hier. :)

    Mit purem, clientseitigem JS ist ein Dateidownload AFAIK nicht möglich. Aber du kannst ja einfach ein Form mit einem versteckten Input-Feld bauen, welches du manipulierst. Beim absenden wird ein serverseitiges Skript (beispielsweise PHP) gestartet, welche die Datei zurückgibt. Wenn man entsprechende Header setzt, wird die Datei direkt zum Download angeboten.

    Das bauen des Formulars und das Absenden kann natürlich im Javascript-Code erfolgen.

    Grüße Marco

    --
    Ich spreche Spaghetticode - fließend.
    1. Moin,

      Leider bin ich kein JS-Kenner und hoffe einfach mal auf die Köpfe von hier. :)

      Mit purem, clientseitigem JS ist ein Dateidownload AFAIK nicht möglich. Aber du kannst ja einfach ein Form mit einem versteckten Input-Feld bauen, welches du manipulierst. Beim absenden wird ein serverseitiges Skript (beispielsweise PHP) gestartet, welche die Datei zurückgibt. Wenn man entsprechende Header setzt, wird die Datei direkt zum Download angeboten.

      Das bauen des Formulars und das Absenden kann natürlich im Javascript-Code erfolgen.

      Grüße Marco

      Danke schonmal.. jedoch kann ich damit recht wenig anfangen, da meine JS,PHP Fähigkeiten gleich null sind, deswegen war ich froh über diesen Foren Beitrag.

      Vil. irgendein Ansatz wie ich das ohne große Programmier Kenntnisse lösen kann?

      1. Moin,

        Vil. irgendein Ansatz wie ich das ohne große Programmier Kenntnisse lösen kann?

        Ohne programmieren geht es nicht ;) Aber das kann man ja lernen.

        Das PHP-Skript könnte beispielsweise so ähnlich aussehen:

        <?php  
        if(isset($_GET['filename']) && file_exists($_GET['filename'])) {  
          header("Content-Type: application/octet-stream");  
          header("Content-Disposition: attachment; filename=\"".$_GET['filename']."\"");  
          @readfile($_GET['filename']);  
          die();  
        }  
        else {  
          echo ("Fehler!");  
        }  
        ?>
        

        Natürlich muss man noch darauf achten, dass der User nur Dateien herunterladen kann, die er auch herunterladen darf, und die Fehlerbehandlung sollte ausgebaut werden, aber für eine lokale Testumgebung reicht das aus.

        Diesem PHP-Skript kannst du also per GET einen Dateinamen übergeben und das Skript bietet diese Datei zum Download an.

        Du kannst also entweder ein Formular bauen und absenden, oder einen Link setzen, in dem der Dateiname direkt mit in der URL steht, beispielsweise so:

        <a href="download.php?filename=foobar.txt" target="_blank">Download</a>  
        
        

        Grüße Marco

        --
        Ich spreche Spaghetticode - fließend.
        1. Tach!

          Das PHP-Skript könnte beispielsweise so ähnlich aussehen:
          [code lang=php]<?php
          if(isset($_GET['filename']) && file_exists($_GET['filename'])) {
            header("Content-Type: application/octet-stream");
            header("Content-Disposition: attachment; filename="".$_GET['filename'].""");
            @readfile($_GET['filename']);
            die();
          }

          Das ist sicherheitstechnisch fehlerhaft, weil es sämtliche lesbare Dateien auf dem Server ausliefern kann. Es fehlt beispielsweise eine Überprüfung, dass der realpath() des Dateinamens mit dem beabsichtigten Download-Verzeichnis beginnt.

          dedlfix.

          1. Moin,

            Das ist sicherheitstechnisch fehlerhaft, weil es sämtliche lesbare Dateien auf dem Server ausliefern kann. Es fehlt beispielsweise eine Überprüfung, dass der realpath() des Dateinamens mit dem beabsichtigten Download-Verzeichnis beginnt.

            Korrekt. Deshalb ist es, wie ich schon geschrieben habe, nur zur Veranschaulichung in einer lokalen Testumgebung zu benutzen.

            Außer der Überprüfung eines gewollten Downloadverzeichnisses mit realpath() kann es _je nach Anwendungsfall_ noch sinnvoll sein
              - sämltliche .ht-Dokumente vom Download auszuschließen
              - PHP-Dateien vom Download auszuschließen (da der source code von PHP-Dateien zurückgegeben würde)
              - den Dateinamen auf ein bestimmtes Pattern zu prüfen ( myproject-[0-9]+.[0-9]+.zip )

            Aber das ist alles Code, der weitere Fehlerquellen beinhalten kann, sodass es IMO am sinnvollsten ist, mit einem Minimalbeispiel zu beginnen, und auf Sicherheit zu achten, wenn man das Skript verstanden hat. Außerdem ist die Gefahr gering, dass dieses Schnipsel jemand per copy&paste verwendet, da erstens die Sicherheitsmängel offensichtlich sind, und ich zweitens auch darauf hingewiesen habe.

            Grüße Marco

            --
            Ich spreche Spaghetticode - fließend.
            1. Tach!

              Das ist sicherheitstechnisch fehlerhaft, weil es sämtliche lesbare Dateien auf dem Server ausliefern kann. Es fehlt beispielsweise eine Überprüfung, dass der realpath() des Dateinamens mit dem beabsichtigten Download-Verzeichnis beginnt.
              Korrekt. Deshalb ist es, wie ich schon geschrieben habe, nur zur Veranschaulichung in einer lokalen Testumgebung zu benutzen.

              Stimmt, hast du geschrieben. Aber so wie ich das überlesen habe, kopieren sich viele den Code und freuen sich, dass er augenscheinlich funktioniert. Deswegen sollte man, wenn man sie nicht vollständig implementieren möchte, die Sicherheitsprüfung zumindest so andeuten, dass der Code erst dann lauffähig ist, wenn man den Hinweis darauf entfernt oder die fehlende Prüfung eingebaut hat.

              Außer der Überprüfung eines gewollten Downloadverzeichnisses mit realpath() kann es _je nach Anwendungsfall_ noch sinnvoll sein
                - sämltliche .ht-Dokumente vom Download auszuschließen
                - PHP-Dateien vom Download auszuschließen (da der source code von PHP-Dateien zurückgegeben würde)
                - den Dateinamen auf ein bestimmtes Pattern zu prüfen ( myproject-[0-9]+.[0-9]+.zip )

              Am besten ist allerdings wenn man ein Verzeichnis außerhalb des DocumentRoot hat und dort nur die gewünschten Dateien und nichts anderes reinlegt. Dann kann man sich weitere Prüfungen sparen (außer der realpath()-Prüfung).

              dedlfix.

    2. Hallo,

      Mit purem, clientseitigem JS ist ein Dateidownload AFAIK nicht möglich.

      Hä? document.location.href='path/to/file.zip'; Der Filename muss sich natürlich aus dem Value der letzten Liste ergeben...

      vg ichbinich

      --
      Kleiner Tipp:
      Tofu schmeckt am besten, wenn man es kurz vor dem Servieren durch ein saftiges Steak ersetzt...
      1. Hallo,

        Mit purem, clientseitigem JS ist ein Dateidownload AFAIK nicht möglich.

        Hä? document.location.href='path/to/file.zip'; Der Filename muss sich natürlich aus dem Value der letzten Liste ergeben...

        vg ichbinich

        Also gibt es doch eine Möglichkeit es mit JS umzusetzen, die Lösung ist anscheinend ja unsicher?

        lg Patrick

        1. Moin,

          Also gibt es doch eine Möglichkeit es mit JS umzusetzen, die Lösung ist anscheinend ja unsicher?

          Direkt auf die Datei zu verlinken ist immer eine Möglichkeit. Allerdings können da natürlich verschiedene Dinge passieren:
            - Bilder werden meist direkt im Browser angezeigt; um auf die ursprüngliche Seite
              zurückzukommen muss man im Browser zurückgehen (oder den neuen Tab schließen).
            - PDF-Dokumente werden direkt im Browser angezeigt (sofern ein entsprechendes Plugin
              installiert ist)
            - PHP-Dateien werden nicht heruntergeladen, sondern ausgeführt (das kann, wenn man
              einen Quelltext anbieten will, unerwünscht sein
            - Audio-Dateien werden oftmals direkt im Browser abgespielt
            - Video-Dateien werden auch oft direkt wiedergegeben

          Möchte man, egal welchen Dateityp man hat, einen Download erzwingen kommt man um eine serverseitige Technik nicht herum.

          Wenn dir der einfache Link zur Datei genügt, ist es natürlich die einfachste aller Möglichkeiten.

          Grüße Marco

          --
          Ich spreche Spaghetticode - fließend.
          1. Möchte man, egal welchen Dateityp man hat, einen Download erzwingen kommt man um eine serverseitige Technik nicht herum.

            Es gibt das download-Attribut.

            Browserunterstützung.

            Mathias

            1. Moin,

              Browserunterstützung.

              Ok das kannte ich nicht. Aber die Browserunterstützung ist noch sehr mau.

              Grüße Marco

              --
              Ich spreche Spaghetticode - fließend.