Melina: PDF Downloaden

Guten Abend,

ich möchte auf meiner Seite ein PDF einbinden. Wenn ich auf einen Link klicke soll die PDF herunter geladen werden und _nicht_ im Browser geöffnet. Wie kann ich dieses verhalten erzwingen?

  1. Guten Abend,

    ich möchte auf meiner Seite ein PDF einbinden. Wenn ich auf einen Link klicke soll die PDF herunter geladen werden und _nicht_ im Browser geöffnet. Wie kann ich dieses verhalten erzwingen?

    Sende die Header

    "Content-Type" => "application/pdf",
      "Content-Disposition" => qq(Attachment; filename="asdf.pdf"),
      "Content-Length" => 4711,

    MfG

    1. Hallo,

      Sende die Header

      "Content-Type" => "application/pdf",
        "Content-Disposition" => qq(Attachment; filename="asdf.pdf"),
        "Content-Length" => 4711,

      das heißt, ich lege eine Datei mit dem Namen "download.php" und in diese kommt dieser Code von dir und bei filename fügen ich $_GET["file"].pdf ein, da der Link auf die PDF dann so lauten würde "download.php?file=01" richtig?

      1. Hallo,

        Sende die Header

        "Content-Type" => "application/pdf",
          "Content-Disposition" => qq(Attachment; filename="asdf.pdf"),
          "Content-Length" => 4711,

        das heißt, ich lege eine Datei mit dem Namen "download.php" und in diese kommt dieser Code von dir und bei filename fügen ich $_GET["file"].pdf ein, da der Link auf die PDF dann so lauten würde "download.php?file=01" richtig?

        Na, ein bischen kontrollierter sollte das schon ablaufen. Nehmen wir mal an, es gäbe auf der Seite nur einen Link zum Download, dann genügt es, einen Parameter zu setzen (Wert beliebig):

        %url%?download=1

        Kontrollstruktur:
        if Parameter 'download' im Request:
           sende die header und den Content
        else
           unbekannter Parameter

        Sofern es mehrere Links zum Download gibt, nimm den Wert (Parametername=Wert) hinzu und erweitere die Kontrollstruktur entsprechend.

        MfG

        1. Hallo,

          hab es nun so gemacht

            
          function makeDownload($file, $dir, $type)  
          {  
          	  
          	header("Content-Type: $type");  
            
          	header("Content-Disposition: attachment; filename=\"$file\"");  
            
          	readfile($dir.$file);  
          	  
          }  
            
          $dir = 'kalender/2015/pdf/';  
          $type = 'application/pdf';  
            
          if(!empty($_GET['file']) && !preg_match('=/=', $_GET['file']))  
          {  
          	if(file_exists ($dir.$_GET['file']))  
          	{  
          		makeDownload($_GET['file'], $dir, $type);  
          	}  
          		  
          }  
          
          

          Die Datei wird zwar herunter geladen allerdings kann ich die nicht mehr öffnen, es kommt folgender Hinweis:

          1. Hallo,

            Die Datei wird zwar herunter geladen allerdings kann ich die nicht mehr öffnen, es kommt folgender Hinweis:

            Prüf mal die Länge der Datei vor und nach dem Download. Auf Nummer Sicher gehen: Datei im binmode lesen und im binmode auch senden.

            MfG

          2. Korrigiert mich, wenn ich falsch liege, aber wenn ich einen Downloaddialog erzwingen möchte, benutze ich Octet/stream:

            download.php:

              
            <?php  
              
            $Path = "./01.pdf";  
              
            header("Content-Type: application/octet-stream");  
            header("Content-Disposition: attachment; filename=\"".basename($Path)."\"");  
              
            readfile($Path);  
              
            ?>  
            
            

            Weiterhin übergebe ich gerne Pfade per GET an die download.php, etwa download.php?file="datei.pdf" und evaluiere den Parameter. Dabei habe ich die download.php stets im Document Root und der download Pfad befindet sich meistens im nicht öffentlichen Server Root in einem dortigen Unterordner download. Alle Pfade gehen dann relativ von diesem Ort aus. Damit man nicht auf beliebige Ordner und Dateien  im Server Root zugreifen kann, filtere ich Doppelpunkte aus dem GET-Parameter file heraus und ersetze sie durch einfache Punkte.

            Cheers,
            Baba

            --
            Baba kommt von Basketball
            1. Liebe Mitdenker,
              liebe Wissende,
              liebe Neugierige,

              ja!

              Korrigiert mich, wenn ich falsch liege, aber wenn ich einen Downloaddialog erzwingen möchte, benutze ich Octet/stream:

              Warum nicht den richtigen MIME-Type angeben?
              Durch die Content-Dispoition acht das eigentlich inzwischen jeder Browser so, wie Melina sich das wünscht.

              basename() für den filename ist schon ganz gut. Allerdings ķönnen da immer noch Zeichen im String sein, mit denen der Client nix anfangen kann.

              Einen Pfad aus $_GET zu akzeptieren ist eine ganz böse Idee. Allerdings könnte da basename() auch ausreichen.

              Anstelle von Request-Parametern kann man auch mit mod_rewrite und path_info arbeiten. Dann sieht die URL auch hübsch aus

              GET example.org/files/kalender.pdf

              Bei allen Requests auf /files/ einfach das Skript aufrufen. Das guckt dann in path_info und holt sich dort den ersten Teil, falls mehrere enthalten sind.

              Das bringt die User dann gar nicht erst auf die Idee, herumzuexperimentieren, um an die passwd oder andere nette Systemdateien zu kommen.

              Weiterhin übergebe ich gerne Pfade per GET an die download.php, etwa download.php?file="datei.pdf" und evaluiere den Parameter. Dabei habe ich die download.php stets im Document Root und der download Pfad befindet sich meistens im nicht öffentlichen Server Root in einem dortigen Unterordner download. Alle Pfade gehen dann relativ von diesem Ort aus. Damit man nicht auf beliebige Ordner und Dateien  im Server Root zugreifen kann, filtere ich Doppelpunkte aus dem GET-Parameter file heraus und ersetze sie durch einfache Punkte.

              siehe oben: mod_rewrite

              Spirituelle Grüße
              Euer Robert

              --
              Möge der Forumsgeist wiederbelebt werden!
              1. Einen Pfad aus $_GET zu akzeptieren ist eine ganz böse Idee. Allerdings könnte da basename() auch ausreichen.

                Wie gesagt, ich verwende relative Pfade unterhalb eines von mir definierten Ordners, den ich in der download.php definiere. Also nicht übergebe. Nach oben kann man nicht, da ich den Doppelpunkt durch den einfachen Punkt ersetze.

                Cheers,
                Baba

                --
                Baba kommt von Basketball
                1. Liebe Mitdenker,
                  liebe Wissende,
                  liebe Neugierige,

                  ja!

                  Einen Pfad aus $_GET zu akzeptieren ist eine ganz böse Idee. Allerdings könnte da basename() auch ausreichen.

                  Wie gesagt, ich verwende relative Pfade unterhalb eines von mir definierten Ordners, den ich in der download.php definiere. Also nicht übergebe. Nach oben kann man nicht, da ich den Doppelpunkt durch den einfachen Punkt ersetze.

                  Zeig bitte mal, wie Du das machst.

                  Spirituelle Grüße
                  Euer Robert

                  --
                  Möge der Forumsgeist wiederbelebt werden!
                  1. Zeig bitte mal, wie Du das machst.

                    while (substr_exists($File, "..")) $File = str_replace("..", ".", $File);

                    Cheers,
                    Baba

                    --
                    Baba kommt von Basketball
                    1. Liebe Mitdenker,
                      liebe Wissende,
                      liebe Neugierige,

                      ja!

                      Zeig bitte mal, wie Du das machst.

                      while (substr_exists($File, "..")) $File = str_replace("..", ".", $File);

                      Gut. Netter Wrapper für "while(false !== strpos($File, '..'))" ...

                      Spirituelle Grüße
                      Euer Robert

                      --
                      Möge der Forumsgeist wiederbelebt werden!
                      1. Liebe Mitdenker,
                        liebe Wissende,
                        liebe Neugierige,

                        ja!

                        Zeig bitte mal, wie Du das machst.

                        while (substr_exists($File, "..")) $File = str_replace("..", ".", $File);

                        Gut. Netter Wrapper für "while(false !== strpos($File, '..'))" ...

                        Was kommt eigentlich dabei heraus, wenn man

                          
                          
                            $File = str_replace(array('...','..','..'), ".", $File);  
                          
                        
                        

                        schreibt?

                        Spirituelle Grüße
                        Euer Robert

                        --
                        Möge der Forumsgeist wiederbelebt werden!
                    2. Hallo,

                      Zeig bitte mal, wie Du das machst.

                      while (substr_exists($File, "..")) $File = str_replace("..", ".", $File);

                      Cheers,
                      Baba

                      Entschuldige bitte, aber wenn du von Doppelpunkt schreibst, denke ich an ":". Was du meinst ist ein doppelter Punkt. Was machst du übrigens, wenn ich mit vier Punkten ankomme?

                      Gruß
                      Kalk

                      1. Hallo

                        Was machst du übrigens, wenn ich mit vier Punkten ankomme?

                        du verwendest eine while-Schleife, ok, das hab ich übersehen...

                        Gruß
                        Kalk

                      2. Om nah hoo pez nyeetz, Tabellenkalk!

                        while (substr_exists($File, "..")) $File = str_replace("..", ".", $File);

                        Was machst du übrigens, wenn ich mit vier Punkten ankomme?

                        Naja „while“ heißt …

                        while (strstr($File, "..")) $File = str_replace("..", ".", $File);  
                        
                        

                        Solange in $File der Teilstring ".." vorkommt ersetze ihn wieder und wieder und wieder durch "."

                        Aber die Frage war sicher rein rethorisch. ;-)

                        Matthias

                        --
                        Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Ohm und Ohmdenosaurus.

            2. Korrigiert mich, wenn ich falsch liege, aber wenn ich einen Downloaddialog erzwingen möchte, benutze ich Octet/stream:

              Ein schmutziger Hack würde darin bestehen, dem Browser einen ihm völlig unbekannten, ggf. zufällig generierten Content-Type-Header zu senden um einen "Speichern unter..." Dialog aus ihm herauszuwürgen. Tablet-Benutzer erfreuen sich gelegentlich dann der Tatsache, dass sie diesen fiesen Dialog gar nicht erst zu sehen bekommen.

              Weiterhin übergebe ich gerne Pfade per GET an die download.php, etwa download.php?file="datei.pdf" und evaluiere den Parameter.

              Mach eine interne Tabelle als Map von {number => /path/file}, lege als Parameter file=number in die Klick-Links und Du ersparst Dir das Gefummel mit den Pfadangaben und schreibst Dir keine sicherheitsbedenklichen Geschichten. Eine solche Konfiguration ist einfacher zu pflegen als der Programmcode, des Weiteren kann dafür auch ein Basisverzeichnis konfiguriert sein und die Download-Liste kann aus der Konfiguration heraus automatisch erstellt werden.

              MfG

              1. Hi,

                Korrigiert mich, wenn ich falsch liege, aber wenn ich einen Downloaddialog erzwingen möchte, benutze ich Octet/stream:
                Ein schmutziger Hack würde darin bestehen, dem Browser einen ihm völlig unbekannten, ggf. zufällig generierten Content-Type-Header zu senden um einen "Speichern unter..." Dialog aus ihm herauszuwürgen.

                warum sollte man das tun? Genau dafür ist doch application/octet-stream gedacht.

                Dass es mal Browser gab[*], die man so nicht zur Vernunft bringen konnte, ist eine andere Sache. Die hätten auf einen erfundenen Content-Type aber auch nicht wie gewünscht reagiert. Deswegen kamen ja oft Krücken zur Anwendung, etwa ein einzelnes JPEG-Bild oder ein Video noch zu zippen.

                [*] Ja, der IE war bis mindestens Version 6 ein solcher Problembär. Der hat nämlich generell die ersten paar Bytes der empfangenen Nutzdaten untersucht, und sobald er den Typ erkannt hatte (oder erkannt zu haben glaubte), war ihm der vom Server übermittelte Content-Type schnurz. Andere Browser haben Quelltext angezeigt, wenn eine HTML-Ressource als text/plain gesendet wurde; IE hat HTML interpretiert. Andere Browser bekamen einen Würgreflex, wenn ein JPEG-Bild als text/css gesendet wurde; IE hat das Bild trotzdem erkannt.
                Ob dieses Verhalten in der Zwischenzeit korrigiert wurde, weiß ich nicht.

                Ciao,
                 Martin

                --
                Eine Neandertaler-Sippe sitzt in ihrer kalten Höhle. Seufzt der Stammesälteste: "Hoffentlich erfindet bald jemand das Feuer!"
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                1. Aloha ;)

                  [*] Ja, der IE war bis mindestens Version 6 ein solcher Problembär. Der hat nämlich generell die ersten paar Bytes der empfangenen Nutzdaten untersucht, und sobald er den Typ erkannt hatte (oder erkannt zu haben glaubte), war ihm der vom Server übermittelte Content-Type schnurz. Andere Browser haben Quelltext angezeigt, wenn eine HTML-Ressource als text/plain gesendet wurde; IE hat HTML interpretiert. Andere Browser bekamen einen Würgreflex, wenn ein JPEG-Bild als text/css gesendet wurde; IE hat das Bild trotzdem erkannt.

                  Du hast den IE6 einfach nur falsch verstanden... das waren keine Bugs, sondern Features! :D Wie kommst du als eitler Webentwickler auch darauf, den erhabenen Internet-Erkunder über das Wesen eines Downloads hinwegtäuschen zu wollen. Der erhabene Herr X-Plörre lässt sich doch kein x für ein u, pardon, kein Plaintext für HTML vormachen :D

                  Heutzutage würde man das als intelligentes Verhalten werten... Smart-Eplorer, läuft insbesondere auf Smart-TV's...

                  Übrigens, die Smart-TV's, sind das die, auf denen man kein RTL (a.k.a. Assi-TV) zum Laufen bekommt?

                  Ist ja schon gut, ich troll mich ;)

                  Grüße,

                  RIDER

                  --
                  Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
                  ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
                  1. Hallo

                    Übrigens, die Smart-TV's, sind das die, auf denen man kein RTL (a.k.a. Assi-TV) zum Laufen bekommt?

                    Wenn du dieses Nichts in HD meinst, nicht ohne weitere Maßnahmen a.k.a CI+- bzw. HD+-Modul und Smartcard. Aber auch dann nur mit Aufnahmeverbot und Timeshift-Begrenzung. Wofür das bei deren „Programminhalten“ auch immer gut sein soll.

                    Ist ja schon gut, ich troll mich ;)

                    Ok.

                    Tschö, Auge

                    --
                    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
                    Terry Pratchett, "Wachen! Wachen!"
                    ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
                    Veranstaltungsdatenbank Vdb 0.3
                2. Liebe Mitdenker,
                  liebe Wissende,
                  liebe Neugierige,

                  ja!

                  warum sollte man das tun? Genau dafür ist doch application/octet-stream gedacht.

                  Ist es nicht.

                  Es ist dafür gedacht, auch Ressourcen anbieten zu können, denen keine Applikation zuzuordnen ist, also die keinen definierten MIME-Type haben. Oft verspielt man sich damit die Möglichkeit, im Download-Dialog neben "Speichern unter" gleich eine passende Applikation al Alternative vorzuschlagen.

                  Was "passend" ist, bestimmt sowieso der Client in seinem Reich ganz alleine

                  Spirituelle Grüße
                  Euer Robert

                  --
                  Möge der Forumsgeist wiederbelebt werden!
                3. Hi,

                  Ob dieses Verhalten in der Zwischenzeit korrigiert wurde, weiß ich nicht.

                  Probiern wirs doch mal aus, mein Content ist ein bischen text und ich sende die header:

                    
                      $self->header(  
                          "Content-Type" => "llafuz/zufall",  
                          "Content-Disposition" => "Attachment; filename=blast.exe"  
                      );  
                  
                  

                  IE 8: Fragt, ob ich die Datei 'blast.exe' speichern oder ausführen möchte
                  FF 34.0: Bietet die Datei 'blast.exe' zum Speichern an

                  MfG ;)

                  1. Hallo,

                    Ob dieses Verhalten in der Zwischenzeit korrigiert wurde, weiß ich nicht.
                    Probiern wirs doch mal aus, mein Content ist ein bischen text und ich sende die header:

                    $self->header(
                            "Content-Type" => "llafuz/zufall",
                            "Content-Disposition" => "Attachment; filename=blast.exe"
                        );

                    
                    >   
                    > IE 8: Fragt, ob ich die Datei 'blast.exe' speichern oder ausführen möchte  
                      
                    der orientiert sich also am vorgeschlagenen Dateinamen, anstatt am (unbekannten) Content-Type. IMO auch nicht ganz sauber. Das ist aber nicht das, was ich beschrieben habe. Nimm mal ein HTML-Dokument als tatsächlichen Content und sende es als text/plain. Was macht der IE? Rendert er HTML oder zeigt er den Roh-Text an?  
                      
                    
                    > FF 34.0: Bietet die Datei 'blast.exe' zum Speichern an  
                      
                    Das ist okay und erwartungskonform.  
                      
                    Ciao,  
                     Martin  
                    
                    -- 
                    Okay, Alkohol ist keine Antwort.  
                    Aber manchmal vergisst man beim Trinken wenigstens die Frage.  
                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                    
                    1. Hallo,

                      der orientiert sich also am vorgeschlagenen Dateinamen, anstatt am (unbekannten) Content-Type. IMO auch nicht ganz sauber. Das ist aber nicht das, was ich beschrieben habe. Nimm mal ein HTML-Dokument als tatsächlichen Content und sende es als text/plain. Was macht der IE? Rendert er HTML oder zeigt er den Roh-Text an?

                      Content-Type: text/plain => Mein IE 8 rendert HTML

                      derselbe HTML-Content (vollständige Seite) und ohne filename im Header
                      Content-Type: foo/bar => Download-Dialog
                      Hier erscheint im Download-Dialog: Unbekannter Dateityp, Dateiname wie URL/Path

                      Es ist müßig, das Verhalten des IE zu erforschen. Aber bei einem unbekannten Content-Type-Header kotzt er den Download-Dialog aus.

                      Schöne Grüße.

                      --
                      Ohh diese Seitenstecher-Werbung, an Öl vier Alice, brobiersch Karle!
              2. Ich habe ein Document Root html, wo die download.php liegt:
                /html/download.php (erreichbar unter www.example.com/download.php)

                Ich habe einen Ordner für Downloads (für jede meiner Domains ein anderes) , welches oberhalb des Document Root liegt.
                /files/<domain>/_data/files (die Domain wird von der download.php ermittelt.

                Mach eine interne Tabelle als Map von {number => /path/file}, lege als Parameter file=number in die Klick-Links und Du ersparst Dir das Gefummel mit den Pfadangaben und schreibst Dir keine sicherheitsbedenklichen Geschichten.

                1. Was meinst Du für ein Gefummel?
                Ich finde es sehr komfortabel, wenn ich per www.example.com/download?file=/infomaterial/Manual.pdf
                die Datei /file/www.example.com/_data/files/infomaterial/Manual.pdf ausliefern kann.

                2. Was genau ist daran sicherheitsbedenklich?
                Über die download.php gelangt man NUR in diesen einen Ordner. Oder übersehe ich etwas?

                Eine solche Konfiguration ist einfacher zu pflegen als der Programmcode, des Weiteren kann dafür auch ein Basisverzeichnis konfiguriert sein und die Download-Liste kann aus der Konfiguration heraus automatisch erstellt werden.

                3. Was soll daran leichter zu pflegen sein?
                Die Map aktuell halten, jedes einzelne Dateichen dort einzutragen finde ich ziemlich aufwändig. Außerdem finde ich es nicht schön, wenn aus den Dateien nur Nummern werden. So sagt einem der Link überhaupt nichts über den zu erwartenden Inhalt!

                Bin gespannt.

                Cheers,
                Baba

                --
                Baba kommt von Basketball
                1. Liebe Mitdenker,
                  liebe Wissende,
                  liebe Neugierige,

                  ja!

                  1. Was meinst Du für ein Gefummel?
                    Ich finde es sehr komfortabel, wenn ich per www.example.com/download?file=/infomaterial/Manual.pdf
                    die Datei /file/www.example.com/_data/files/infomaterial/Manual.pdf ausliefern kann.

                  2. Was genau ist daran sicherheitsbedenklich?
                    Über die download.php gelangt man NUR in diesen einen Ordner. Oder übersehe ich etwas?

                  und die darunterliegenden, so wie Du das beschrieben hast.

                  Alle Dateien, die unter dem gesetzten Wurzelpunkt liegen, sind im Quelltext auslesbar, also auch alle php-Scripte :-O

                  Wolltest Du das?

                  Ich habe nicht nachgefragt, wie Du das machst, weil ich lange Weile habe, sondern weil ich schon eine Menge "desparate home progger" am Rohr gehabt habe, die sich überhaupt nicht vorstellen konnten (oder nicht wollten?), wo den die Lücke ist. Natürlich ist dann PHP schuld ;-P

                  Spirituelle Grüße
                  Euer Robert

                  --
                  Möge der Forumsgeist wiederbelebt werden!
                  1. Aloha ;)

                    Über die download.php gelangt man NUR in diesen einen Ordner. Oder übersehe ich etwas?

                    und die darunterliegenden, so wie Du das beschrieben hast.

                    Alle Dateien, die unter dem gesetzten Wurzelpunkt liegen, sind im Quelltext auslesbar, also auch alle php-Scripte :-O

                    Wolltest Du das?

                    Natürlich wollte er das. Lies genauer. Oder was hätten deiner Meinung nach PHP-Skripte außerhalb des document-root zu suchen, wo sich der fragliche Ordner und dessen Unterordner befinden? :P Außerdem ist es ziemlich selbstverständlich, dass in einem extra für download-Dateien angelegten Ordner und dessen Unterordnern nur für Download geeignete Dateien liegen. Zumindest für mich :P

                    Von daher: Nein, aus meiner Sicht keinerlei Sicherheitslücken und auch ansonsten imho ganz elegant.

                    Auch brauchbar, wenn man keinen Zugriff außerhalb des document-root hat... man muss sich nur klarmachen, dass in einem download-ordner und dessen unterordnern nur Dateien liegen dürfen, die auch runtergeladen werden sollen...

                    Ich habe nicht nachgefragt, wie Du das machst, weil ich lange Weile habe,

                    Ne, sondern weil du den Gedanken nicht zu Ende gedacht hast :P

                    Grüße,

                    RIDER

                    P.S.: Bitte nicht als Angriff verstehen!

                    --
                    Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
                    ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[
          3. Liebe Mitdenker,
            liebe Wissende,
            liebe Neugierige,

            ja!

            Die Datei wird zwar herunter geladen allerdings kann ich die nicht mehr öffnen, es kommt folgender Hinweis:

            Deine Skriptdatei gibt vermutlich zusätzliche Zeichen aus. Eine BOM oder trailing Spaces sind da sehr beliebt ;-O

            Spirituelle Grüße
            Euer Robert

            --
            Möge der Forumsgeist wiederbelebt werden!
  2. Om nah hoo pez nyeetz, Melina!

    ich möchte auf meiner Seite ein PDF einbinden. Wenn ich auf einen Link klicke soll die PDF herunter geladen werden und _nicht_ im Browser geöffnet. Wie kann ich dieses verhalten erzwingen?

    Gar nicht. Und das ist auch gut so. Schließlich ist der Browserbesitzer der Bestimmer.

    Matthias

    --
    Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Kai und Kaiserslautern.

    1. Hallo Matthias,

      Gar nicht. Und das ist auch gut so. Schließlich ist der Browserbesitzer der Bestimmer.

      rede doch bitte kein Mist! Sorry wenn ich das so deutlich sage. Ich sehe jeden Tag Seiten wo ich eine PDF herunterladen kann.

      Wenn ich das nicht machen soll, ist die eine Sachen, aber zu sagen es geht nicht, ist die andere Sache, was meiner Meinung nach nicht OK ist!

      1. Om nah hoo pez nyeetz, Melina!

        rede doch bitte kein Mist! Sorry wenn ich das so deutlich sage. Ich sehe jeden Tag Seiten wo ich eine PDF herunterladen kann.

        Selbstverständlich gibt es solche Seiten. Ich kann aber in den Einstellungen meines Browsers bestimmen, wie dieser mit Ressourcen umgehen soll, die mit dem header "application/pdf" daherkommen. Möglicherweise habe ich mich allerdings tatsächlich zu weit aus dem Fenster gelehnt und der Browser reagiert auf "Content-Disposition" => qq(Attachment; filename="asdf.pdf") trotz meiner Vorgabe wirklich mit einem "Speichern unter"-Dialog. Wenn du eine Testseite online stellst, kann ich es ja mal testen.

        Damit wollte ich weder dich persönlich angreifen noch deinen Wunsch als absurd abtun, sondern nur zum Ausdruck bringen, dass du u.U. wenig Einfluss darauf hast, was in den Browsern deiner Besucher tatsächlich passiert. Gerade in Punkto Sicherheit (und ein PDF-Dokument kann durchaus ein Sicherheitsrisiko darstellen) sollten die Wünsche des Users vor denen des Seitenerstellers stehen. Wenn der User das Dokument tatsächlich speichern möchte, kann er das auch tun, wenn er es vorher gesehen hat.(*) Heruntergeladen hat er es in beiden Fällen. Wenn er es vorher nicht sieht, war das Herunterladen möglicherweise umsonst.

        (*) Falls es einen Virus enthält, ist möglicherweise das Browserplugin up-to-dater als irgendein Acrobatreader 9.

        Matthias

        --
        Der Unterschied zwischen Java und JavaScript ist größer als der zwischen neu und neutral.

        1. Om nah hoo pez nyeetz, Melina!

          rede doch bitte kein Mist! Sorry wenn ich das so deutlich sage. Ich sehe jeden Tag Seiten wo ich eine PDF herunterladen kann.

          Selbstverständlich gibt es solche Seiten. Ich kann aber in den Einstellungen meines Browsers bestimmen, wie dieser mit Ressourcen umgehen soll, die mit dem header "application/pdf" daherkommen.

          Das ist toll, dass Du das kannst. Was bestimmst Du denn in den Einstellungen deines Browsers, wenn eine Seite mit dem Header "Content-Type: apliction/qwartz" daherkommt? Das würde mich mal interessieren, weilich mich beim Wort appleiccaution fast regelmäßig vertippe.

          noch deinen Wunsch als absurd abtun, sondern nur zum Ausdruck bringen, dass du u.U. wenig Einfluss darauf hast, was in den Browsern deiner Besucher tatsächlich passiert. Gerade in Punkto Sicherheit (und ein PDF-Dokument kann durchaus ein Sicherheitsrisiko darstellen)

          Nana, der Header kann ja auch was anderes angeben, s.o. Ein Böserwichtl, der annern ihre Rechner so richtig verschweinzen will, schert sich eine Bockwurst um RFC-gerechte Header.

          Schöne Grüße ;)

      2. Hi,

        Gar nicht. Und das ist auch gut so. Schließlich ist der Browserbesitzer der Bestimmer.

        rede doch bitte kein Mist! Sorry wenn ich das so deutlich sage. Ich sehe jeden Tag Seiten wo ich eine PDF herunterladen kann.

        Das hätte dich ja auf die Idee bringen können, dass du vielleicht nicht die erste Person auf der Welt bist, die sowas vorhat … und dann hättest du zu diesem schon oft diskutierten Thema ja vielleicht auch erst mal suchen können.

        MfG ChrisB

        --
        Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
    2. Wenn ich auf einen Link klicke soll die PDF herunter geladen werden und _nicht_ im Browser geöffnet. Wie kann ich dieses verhalten erzwingen?

      Gar nicht. Und das ist auch gut so. Schließlich ist der Browserbesitzer der Bestimmer.

      Ich möchte gerne bei *.mp3 Dateien wählen können, wie ich sie abspiele oder ob ich sie speichere. Meine Opera öffnet bei Klick ohne Rückfrage einen Spieler im Hintergrund (mplayer), den ich unter Ubuntu nicht "sehen", also auch nicht schließen kann.

      Dumm gelaufen, wenn ich minutenlang warten muss, bis der womöglich unerwünschte Lärm zuende ist. Erst dann kann ich weitermachen mit der nächsten Sound-Datei.

      Ja, als kenntnisreicher Browserbesitzer kann "ich" an der entsprechenden Schraube drehen. Aber ich habe auch kenntnisarme bis kenntnislose Hörer.

      Linuchs

  3. Hi!

    ich möchte auf meiner Seite ein PDF einbinden. Wenn ich auf einen Link klicke soll die PDF herunter geladen werden und _nicht_ im Browser geöffnet. Wie kann ich dieses verhalten erzwingen?

    In HTML 5 gibt es das download Attribut:

    <a href="mein.pdf" download>

    Wird aber aktuell nur von Chrome/Opera und Firefox unterstützt
    http://caniuse.com/#feat=download

    Jacob

    1. Hallo,

      In HTML 5 gibt es das download Attribut:

      Vielen Dank, funktioniert wunderbar! Genau das habe ich gesucht.

      Wird aber aktuell nur von Chrome/Opera und Firefox unterstützt
      http://caniuse.com/#feat=download

      Och das ist nicht so schlimm. Sollte jemand mit einem IE oder einem anderen Browser kommen hat eben Pech und muss sich die Datei so herunterladen.

      1. Hallo

        Wird aber aktuell nur von Chrome/Opera und Firefox unterstützt
        http://caniuse.com/#feat=download

        Och das ist nicht so schlimm. Sollte jemand mit einem IE oder einem anderen Browser kommen hat eben Pech und muss sich die Datei so herunterladen.

        Um auch diesem Problem mal die Luft abzulassen, sei gesagt, dass jeder Browser fernab des Erzwingens des Downloaddialogs irgendwas anbietet. Sei es die Anzeige über das festgelegte Browserplugin, welches dem Benutzer u.A. anbietet, das PDF zu speichern (und wenn es als Kopie ist) oder die heruntergeladene Datei mit dem Standardprogramm zu öffnen (und sie von dort abzuspeichern oder sie über den Downloaddialog des Browsers abzuspeichern.

        Irgendwas, was das Speichern der Datei – eventuell über einen Umweg – ermöglicht, geschieht immer. ich selbst benutze, wenn mir die URL des Downloads nicht verschleiert wird, übrigens fast immer den Punkt „Ziel speichern unter“ im über die rechte Maustaste erreichbaren Kontextmenü. Es gibt also noch weitere Wege. :-)

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
        Terry Pratchett, "Wachen! Wachen!"
        ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
        Veranstaltungsdatenbank Vdb 0.3