2010-04-08 17 views
30

Gibt es eine Möglichkeit, den Download-Manager des Benutzers zu zwingen, einen Download für .PDF zu starten, anstatt die .PDF in einem neuen Fenster/Tab anzuzeigen?Wie erzwinge ich automatisch einen PDF-Download?

+0

verwandten: http://stackoverflow.com/questions/1465573/forcing-to-download-a-file-using-php –

Antwort

3

Sie müssen HTTP-Header (Content-disposition) senden, um dies zu tun. Sie können dies nicht auf der Client-Seite tun.

25

Set Content-Disposition in der Httpresponse-Header:

Content-Disposition = 'attachment; filename=filename.pdf' 
+0

Die '; filename = 'Teil [ist optional] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition#Syntax). –

0
<?php 
    // required for IE, otherwise Content-disposition is ignored 
    if(ini_get('zlib.output_compression')) 
     ini_set('zlib.output_compression', 'Off'); 
    } 
$reader = fopen($filename, "r"); 
$contents = fread($reader, filesize($filename)); 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($filename)); 
    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($filename)); 
    ob_end_clean(); 
    echo $contents; 
12

Dies muss in der Server-Seite durchgeführt werden. Sie können dies nicht auf der Client-Seite tun.

Wie es geht, hängt von der serverseitigen Sprache ab.

PHP:

header('Content-Disposition: attachment; filename="' . $filename . '"'); 

Java:

response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); 

.NET:

Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); 

Wenn es kein Mittel, einen beliebigen Server-Side-Code ist, die die PDF-Datei-Streams, dann müssen Sie um es auf Webserver-Ebene zu konfigurieren. In zum Beispiel Apache, können Sie platzieren/erweitern, um eine .htaccess Datei in den Root-PDF-Ordnern mit dem folgenden Eintrag:

<Files *.pdf> 
    Header set Content-Disposition attachment 
</Files> 

oder konfigurieren Sie es global in httpd.conf Datei. Ein ähnlicher Ansatz existiert für IIS mit web.config Datei.

1

.htaccess Lösung:

AddType application/octet-stream .pdf 
2

Ja, es kann ... in JSP-Seite getan wird durch einen Download-Link in einer JSP-Seite geben, auf das geht neue Skript Seite ... und die PDF-Datei herunterladen wie folgt

DownloadPage.JSP Code: -

<a href='downloadPdf.jsp?file=FILE.pdf' >Download PDF File</a> 

downloadPdf.JSP Code: -

<%@ page import="java.util.*,java.io.*"%>    

<% 

    File f = new File ("E:/PDFfiles/Downloads/" + request.getParameter("file")); 
    response.setContentType ("application/pdf"); 
    response.setHeader ("Content-Disposition", "attachment; filename=""+request.getParameter("file")+"""); 
    String name = f.getName().substring(f.getName().lastIndexOf("/") + 1,f.getName().length()); 
    InputStream in = new FileInputStream(f); 
    ServletOutputStream outs = response.getOutputStream(); 


    int bit = 256; 
    int i = 0; 
    try { 
    while ((bit) >= 0) { 
    bit = in.read(); 
    outs.write(bit); 
        } 
     } 
     catch (IOException ioe) { 
       ioe.printStackTrace(System.out); 
      } 
    outs.flush(); 
    outs.close(); 
    in.close(); 
%> 

Quelle: http://bloggerplugnplay.blogspot.in/2012/05/how-to-create-force-download-link-for.html

+0

Großartig! Vielen Dank! Beachten Sie, dass der Dateiname möglicherweise doppelten Backslash \\ benötigt. Es scheint mir auch nicht, dass der String 'name' in diesem Code verwendet wird – gordon613

7

Für IIS:

alle Dateien Legen Sie erzwingen wollen in einem eigenen Ordner zum Download bereit.

Dann in IIS gehen Sie diesen Ordner und doppelklicken Sie auf HTTP Response Headers.

einen neuen Header mit den folgenden Informationen hinzufügen:

Name: Content-Disposition

Wert: Befestigung

Alle Dateien in diesem Ordner, wenn darauf zugegriffen wird, soll als Dialog aufgefordert, das Speichern Box für den entsprechenden Browser.

+1

Funktioniert wirklich gut und muss keine Seite speziell zum Erzwingen von Dateien zum Download erstellen. – Edyn

3
<?php 
header('Content-disposition: attachment; filename=filename.pdf'); 
header('Content-type: application/pdf'); 
readfile('path/to/filename.pdf'); 
30

verwenden, um das herunterladen Attribut in Ihrem <a> Tag

<a href="content/file.pdf" download > pdf link </a>
<a href="content/file.doc" download > doc link </a>

+1

das funktioniert eigentlich nur in Chrome. –

+1

Verwendet und getestet in Chrome, Firefox und IE8. Es funktioniert alles! Simpel und einfach. Hinweis: Wenn Sie 'download =" Dateiname "' verwenden, können Sie sogar den Namen des Downloads ändern! – Marja

+0

Darn ... Ich muss mich korrigieren! Es funktioniert nicht auf IE. Ich habe es auf einer virtuellen Maschine getestet, in der noch kein PDF-Reader installiert war. In diesem Fall wird die Datei immer heruntergeladen. – Marja

0

von VB asp net Code im Internet finde ich diese einfache C# download.aspx Seite gemacht. Sie können mit der Datei URL als "f" querystring Parameter übergeben. (/folder/download.aspx?f=/folder1/beispiel.pdf).

<!DOCTYPE html> 
<html> 
<head><title></title> 
<script runat="server"> 
    void Page_Load(object sender, EventArgs e) 
    { 

     String strRequest = ""; 
     try 
     { 
      strRequest = Request.QueryString["f"].ToString(); 
     } 
     catch 
     { } 

     if (strRequest.Length > 0) 
     { 
      String path = Server.MapPath(strRequest); 
      System.IO.FileInfo File = new System.IO.FileInfo(path); 
      if (File.Exists) 
      { 
       Response.Clear(); 
       Response.AddHeader("Content-Disposition", "attachment; filename=" + File.Name); 
       Response.AddHeader("Content-Length", File.Length.ToString()); 
       Response.ContentType = "application/octet-stream"; 
       Response.WriteFile(File.FullName); 
       Response.End(); 
      }; 
     } 
    } 
</script> 
</head> 
<body></body> 
</html> 
Verwandte Themen