Hoe maak ik een PDF-bestand downloadbaar in een HTML-link?

Ik geef een link van een pdf-bestand op mijn webpagina om te downloaden, zoals hieronder

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

Het probleem is wanneer de gebruiker klikt op deze link dan

  • Als de gebruiker Adobe Acrobat heeft geïnstalleerd, dan wordt het bestand geopend in hetzelfde browservenster in Adobe Reader.
  • Als Adobe Acrobat niet geïnstalleerd is, dan verschijnt er een pop-up voor het downloaden van het bestand.

Maar ik wil dat het altijd pop-up naar de gebruiker om te downloaden, ongeacht "Adobe Acrobat" is geïnstalleerd of niet.

Vertel me alsjeblieft hoe ik dit kan doen?

Oplossing

In plaats van te linken naar het .PDF bestand, doe in plaats daarvan iets als

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

die een aangepaste header uitvoert, de PDF opent (binair veilig) en de gegevens afdrukt naar de browser van de gebruiker's, dan kunnen ze kiezen om de PDF op te slaan ondanks hun browser instellingen. De pdf_server.php zou er als volgt uit moeten zien:

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: en voer natuurlijk een aantal sanity checks uit op de "file" variabele om te voorkomen dat mensen je bestanden stelen, zoals don't accept file extensions, deny slashes, voeg .pdf toe aan de waarde

Commentaren (12)

Dit is de sleutel:

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

Content-type application/x-pdf-document of application/pdf wordt verzonden bij het verzenden van PDF-bestanden. Adobe Reader stelt gewoonlijk de handler voor dit MIME type in, zodat de browser het document aan Adobe Reader zal doorgeven wanneer een van de PDF MIME types wordt ontvangen.

Commentaren (0)

In een Ruby on Rails applicatie (vooral met iets als de Prawn gem en de Prawnto Rails plugin), kun je dit een beetje eenvoudiger bereiken dan een volledig script (zoals het vorige PHP voorbeeld).

In je controller:

def index

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

Het render :layout => false gedeelte vertelt de browser om de "Would you like to download this file?" prompt te openen in plaats van te proberen de PDF te renderen. Dan zou je normaal naar het bestand kunnen linken: http://mysite.com/myawesomepdf.pdf

Commentaren (3)