Wie kann man eine PDF-Datei über einen HTML-Link herunterladen?

Ich biete auf meiner Webseite einen Link zu einer pdf-Datei zum Herunterladen an, wie unten dargestellt

<a href="myfile.pdf">Download Brochure</a>

Das Problem ist, wenn der Benutzer auf diesen Link klickt, dann

  • Wenn der Benutzer Adobe Acrobat installiert hat, wird die Datei im selben Browserfenster mit Adobe Reader geöffnet.
  • Wenn Adobe Acrobat nicht installiert ist, erscheint ein Popup-Fenster, das den Benutzer zum Herunterladen der Datei auffordert.

Ich möchte aber, dass dem Benutzer immer ein Popup-Fenster zum Herunterladen angezeigt wird, unabhängig davon, ob Adobe Acrobat " installiert ist oder nicht.

Bitte sagen Sie mir, wie ich das machen kann?

Lösung

Anstatt auf die PDF-Datei zu verlinken, sollten Sie etwas wie folgt tun

<a href="pdf_server.php?file=pdffilename">Download my eBook</a>

die eine benutzerdefinierte Kopfzeile ausgibt, das PDF öffnet (binärsicher) und die Daten im Browser des Benutzers ausgibt, der dann wählen kann, ob er das PDF trotz seiner Browsereinstellungen speichern möchte. Die pdf_server.php sollte wie folgt aussehen:

header("Content-Type: application/octet-stream");

$file = $_GET["file"] .".pdf";
header("Content-Disposition: attachment; filename=" . urlencode($file));   
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . filesize($file));
flush(); // this doesn't really matter.
$fp = fopen($file, "r");
while (!feof($fp))
{
    echo fread($fp, 65536);
    flush(); // this is essential for large downloads
} 
fclose($fp); 

PS: und führen Sie natürlich einige Sicherheitsüberprüfungen für die Variable "file" durch, um zu verhindern, dass jemand Ihre Dateien stiehlt, z. B. keine Dateierweiterungen akzeptieren, Schrägstriche verweigern, .pdf an den Wert anhängen

Kommentare (12)

Dies ist der Schlüssel:

header("Content-Type: application/octet-stream");

Der Inhaltstyp application/x-pdf-document oder application/pdf wird beim Senden einer PDF-Datei gesendet. Adobe Reader legt normalerweise den Handler für diesen MIME-Typ fest, so dass der Browser das Dokument an Adobe Reader weitergibt, wenn einer der PDF-MIME-Typen empfangen wird.

Kommentare (0)

In einer Ruby on Rails-Anwendung (insbesondere mit dem Prawn-Gem und dem Prawnto-Rails-Plugin) können Sie dies etwas einfacher erreichen als mit einem vollständigen Skript (wie im vorherigen PHP-Beispiel).

In Ihrem Controller:

def index

 respond_to do |format|
   format.html # Your HTML view
   format.pdf { render :layout => false }
 end
end

Der Teil render :layout => false weist den Browser an, die Eingabeaufforderung "Möchten Sie diese Datei herunterladen?" zu öffnen, anstatt zu versuchen, das PDF zu rendern. Dann können Sie ganz normal auf die Datei verlinken: http://mysite.com/myawesomepdf.pdf

Kommentare (3)