Thomas: Download Button programmieren

Hallo,

auf meiner Internetseite kann man sich Dateien herunterladen. Bisher funktioniert das nur mit der Aufforderung mit der rechten Maustaste einen Link anzuwählen und auf Spiechern unter... zu gehen.
Wie programmiert man einen Button mit dem man die Datei sofort speichert (nachdem man den Speicherort ausgesucht hat), also eine Download-Button ?

Gruß
Thomas

  1. Hallo, Thomas

    Dieses Verhalten ist auch vollkommen in Ordnung. Wenn man dem Browser den Befehl geben könnte, den Content eines Links an eine vordefinierte Stelle zu schreiben, wäre das ein gigantisches Sicherheitsloch - man stelle sich nur mal vor, dass auf diese Weise wichtige Dateien überschrieben werden oder Viren und Trojaner ihren Weg auf den Desktop finden...

    Um den Browser dazu zu bringen, die Datei direkt zu speichern, musst Du den HTTP-Header bei der Auslieferung der Datei entsprechend gestalten. An Deiner HTML-Seite kannst Du in dieser Hinsicht jedenfalls nichts machen.

    Gruß, LX

    --
    X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo Lux,

      Gut, wie kann ich nun vorgehen ?

      1. Gut, wie kann ich nun vorgehen ?

        wie dir bereits gesagt wurde: schicke im header die information zur behandlung der datei mit - wie bei http-header-information ist dies aber nur als empfehlung zu sehen und muss nicht beachtet werden - eine 100%ige lösung, die dein problem behebt, gibt es nicht

      2. Hallo, Thomas!

        Versuche es mal mit "Content-Type=binary/data".

        Übrigens heißt es LX (ausgesprochen eL-iX, etwa so wie "Alex" im englischen) und nicht Lux.

        Gruß, LX

        --
        X-Self-Code: sh:( fo:) ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: Unusual
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hallo,

          ich habe vorhin schon nach einer Lösung egsucht aber keine gefunden.
          Ich habe folgenden Header in eine php-Datei eingebaut:
          <?php
          $file = 'Dokumente/" . $dsatz["dateiname"] ."';
          header( 'Content-type: application/download\n' );
          $dateiname = basename( $file );
          header( 'Content-Disposition: attachment; filename="' . $dateiname . '"' );
          ?>

          Was passiert: Die php-Datei wird mir zum Download angeboten.

          Das will ich aber nicht.
          In der php-Datei steht ein Link zu einer Word- oder PDF-Datei. Diese sollen heruntergeladen werden.
          Was muss ich beim Header ändern ?

          Gruß
          Florian

          1. header( 'Content-type: application/download\n' );
            ...
            Was passiert: Die php-Datei wird mir zum Download angeboten.
            Das will ich aber nicht.
            In der php-Datei steht ein Link zu einer Word- oder PDF-Datei. Diese sollen heruntergeladen werden.
            Was muss ich beim Header ändern ?

            Jatzt hast du herausgefunden, dass ein header immer mit dem gegenwärtigen Request/Response zu tun hat.

            Du musst wenn schon den header beim Aufruf der betroffenen Dateien ändern, entweder im Code der betroffenen Dateien selbst, oder sonst durch einen Umweg, womöglich mittels .htaccess.

            mfg Beat

            --
            Woran ich arbeite:
            X-Torah
               <°)))o><                      ><o(((°>o
            1. Gut, aber wie ändere ich das bei einem Download einer Word-Datei ?

              1. Gut, aber wie ändere ich das bei einem Download einer Word-Datei ?

                echo "Content-type: application/msword\n\n";

                /* word datei einlesen und hinterherschicken */

                Hotte

                1. Danke, aber es könnte auch eine PDF oder eine Excel Datei sein. Das kann variieren.
                  Wie wäre dann der Header ?
                  Wird mir aber dann die php-datei als Word geschickt oder die Datei auf die sich der Link in der Word Datei bezieht ?

                  1. Danke, aber es könnte auch eine PDF oder eine Excel Datei sein. Das kann variieren.
                    Wie wäre dann der Header ?

                    Hier müsstest du selbst eine Liste in deinem Skript verwalten.

                    Aber um es gleich zu sagen:
                    Mit hottis Rat ist nichts geändert.

                    Content-type: application/octet-Stream erzwingt das Speichern-Dialog beim Browser.
                    Bei allen anderen content-type Typen könnte ein Browser auf die Idee kommen, zu fragen, ob es geöffnet werden soll, oder tut dies sogar automatisch.

                    Aber insgesamt finde ich, du bist mit deinem Unterfangen auf der falschen Piste.
                    Wenn du definitiv willst, dass eine Datei nur als anonymer Inhalt runter geladen werden kann, und nicht sofort geöffnet, so verpacke sie in ein zipfile.

                    mfg Beat

                    --
                    Woran ich arbeite:
                    X-Torah
                       <°)))o><                      ><o(((°>o
                  2. hi,

                    Danke, aber es könnte auch eine PDF oder eine Excel Datei sein. Das kann variieren.
                    Wie wäre dann der Header ?

                    Content-type: %type%

                    Der %type% steht in "mime.types" der config Datei eines Apache Web Servers, den Link dazu postete ich bereits weiter oben in diesem Thread.

                    Mit freundlichen Grüßen und Tschüss,
                    Hotte

          2. Hallo,

            header( 'Content-type: application/download\n' );

            Diesen Content-Type gibt es nicht. Außerdem braucht der Header zwei "\n\n", damit eine Leerzeile entsteht.

            Was der Apache so an Content-type's kennt, steht hier:
            http://rolfrost.de/cgi-bin/download.cgi/mime.types?download=mime.types

            Bau Dir mal ein testscript, was nur folgendes ausgibt:

            "Content-type: application/octet-stream\n\n"
            "\0"

            Starte den Browser und schau mal was passiert. Es sollte dem Verständnis dienen.

            Hotte

            1. Hi,

              header( 'Content-type: application/download\n' );
              Diesen Content-Type gibt es nicht. Außerdem braucht der Header zwei "\n\n", damit eine Leerzeile entsteht.

              eine Header-Zeile braucht nur einen Umbruch, allerdings CRLF (i.d.R. \r\n); zwei Umbrüche beenden den kompletten Header. Die _Funktion_ header() benötigt lediglich den Inhalt der Zeile, nicht ihre Ende-Markierung. Es ist der Job dieser Funktion, das Ende der Zeile selbst herzustellen.

              Wobei ich bis heute nicht verstehe, warum header() nur einen Wert entgegennimmt anstatt zwei (Name des Headers und sein Wert). Die Erklärung header('HTTP/1.1 404 File Not Found') reicht nicht aus, weil dies erstens auch mit dieser Schnittstelle möglich wäre, und zweitens IMHO nicht Aufgabe einer header()-Funktion ist. Nur weil etwas zufällig in einem Header steht heißt das nicht, dass eine Header-Schnittstelle es abbilden muss - genauso gut könnte es z.B. responseStatus() geben.

              Aber ich schweife ab ...

              Cheatah

              --
              X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
              X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
              X-Will-Answer-Email: No
              X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo,

    auf meiner Internetseite kann man sich Dateien herunterladen. Bisher funktioniert das nur mit der Aufforderung mit der rechten Maustaste einen Link anzuwählen und auf Spiechern unter... zu gehen.
    Wie programmiert man einen Button mit dem man die Datei sofort speichert (nachdem man den Speicherort ausgesucht hat), also eine Download-Button ?

    Button oder Link:
    Der Klick löst einen serverseitigen Prozess aus und der macht folgendes:

    • schickt den Content-Type der Datei auf STDOUT
    • schickt die Datei hinterher, auch auf STDOUT

    Falls Du es als Link machst, hast Du die Möglichkeit, den Dateinamen mit anzugeben:

    anstelle
    download.php?download=dateiname
    notierst Du
    download.php/dateiname?download=dateiname

    Damit wird die Datei mit dem richtigen Namen zum "Speichern unter..." angeboten.

    http://rolfrost.de/download.html (in Perl)

    Hotte

  3. Hallo,

    ich habe das hiermit gemacht:

      
      
    <?php  
      
     $fileDownloadName = "DeineDatei.pdf";  
      
      
     header('Content-Description: File Transfer');  
     header('Content-Type: application/octet-stream');  
     header('Content-Disposition: attachment; filename='.basename($fileDownloadName));  
     header('Content-Transfer-Encoding: binary');  
     header('Expires: 0');  
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0');  
     header('Pragma: public');  
     header('Content-Length: ' . filesize(($fileDownloadName)));  
     header('Connection: Close');  
      
     readfile($tempFile);  
      
     exit;  
    ?>  
    
    

    Gruß,
    Floater

    1. Hallo,

      bitte "$tempFile" ersetzen durch "$fileDownloadName"!

      Gruß,
      Floater