it-swarm.com.de

Zum Öffnen des "Speichern unter ..." - Popup-Fensters öffnen PDF in HTML

Ich habe auf meiner Website einige große PDF Kataloge, die ich als Download verknüpfen muss. Wenn ich gegoogelt habe, habe ich etwas gefunden, das unten aufgeführt ist. Es sollte das Popup "Speichern unter ..." beim Klicken auf ... öffnen.

 <head>
    <meta name="content-disposition" content="inline; filename=filename.pdf">
    ...

Aber es funktioniert nicht:/Wenn ich wie unten auf eine Datei verlinke, wird eine Verknüpfung zu einer Datei hergestellt und die Datei wird geöffnet.

    <a href="filename.pdf" title="Filie Name">File name</a>

UPDATE (entsprechend den Antworten unten):

Wie ich sehe, gibt es dafür keine 100% zuverlässige Cross-Browser-Lösung. Wahrscheinlich ist der beste Weg, einen der unten aufgeführten Web-Services zu verwenden und einen Download-Link zu geben ...

140

Aus einer Antwort auf Erzwinge, dass ein Browser die Datei speichert, nachdem er auf den Link geklickt hat:

<a href="path/to/file" download>Click here to download</a>
227
Ayush Gupta
<a href="file link" download target="_blank">Click here to download</a>

Es funktioniert für mich in Firefox und Chrome.

74
DrWaky

Meta-Tags sind kein zuverlässiger Weg, um dieses Ergebnis zu erreichen. Im Allgemeinen sollten Sie dies nicht einmal tun - es sollte dem Benutzer/Benutzer-Agenten überlassen bleiben, zu entscheiden, wie er mit den von Ihnen bereitgestellten Inhalten umgehen soll. Der Benutzer kann seinen Browser jederzeit dazu zwingen, die Datei herunterzuladen, wenn er möchte.

Wenn Sie dennoch den Browser zum Herunterladen der Datei zwingen möchten, ändern Sie die HTTP-Header direkt. Hier ein Codebeispiel von PHP:

$path = "path/to/file.pdf";
$filename = "file.pdf";
header('Content-Transfer-Encoding: binary');  // For Gecko browsers mainly
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', filemtime($path)) . ' GMT');
header('Accept-Ranges: bytes');  // Allow support for download resume
header('Content-Length: ' . filesize($path));  // File size
header('Content-Encoding: none');
header('Content-Type: application/pdf');  // Change the mime type if the file is not PDF
header('Content-Disposition: attachment; filename=' . $filename);  // Make the browser display the Save As dialog
readfile($path);  // This is necessary in order to get it to actually download the file, otherwise it will be 0Kb

Beachten Sie, dass dies nur eine Erweiterung des HTTP-Protokolls ist. Einige Browser ignorieren es trotzdem.

33
Karel Petranek

Ich hatte das gleiche Problem und fand eine Lösung, die bisher gut funktioniert hat. Sie fügen den folgenden Code in Ihre .htaccess-Datei ein: 

<FilesMatch "\.(?i:pdf)$">
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</FilesMatch>

Es kam aus Erzwingt das Herunterladen einer Datei, anstatt sich im Browser zu zeigen.

20
Tony

Ich habe eine sehr einfache Lösung für Firefox gefunden (funktioniert nur mit einem Verwandten statt mit einem direkten href): add type="application/octet-stream":

<a href="./file.pdf" id='example' type="application/octet-stream">Example</a>
7
User

Versuchen Sie, diese Zeile zu Ihrer .htaccess-Datei hinzuzufügen.

AddType application/octet-stream .pdf

Ich hoffe es funktioniert, da es browserunabhängig ist.

5
Sharad Gautam

Im Allgemeinen geschieht dies, weil einige Browsereinstellungen oder Plug-Ins PDF direkt im selben Fenster wie eine einfache Webseite öffnen.

Folgendes könnte Ihnen helfen. Ich habe es in PHP vor ein paar Jahren gemacht. Aber momentan arbeite ich nicht an dieser Plattform.

<?php
    if (isset($_GET['file'])) {
        $file = $_GET['file'];
        if (file_exists($file) && is_readable($file) && preg_match('/\.pdf$/',$file)) {
            header('Content-type: application/pdf');
            header("Content-Disposition: attachment; filename=\"$file\"");
            readfile($file);
        }
    }
    else {
        header("HTTP/1.0 404 Not Found");
        echo "<h1>Error 404: File Not Found: <br /><em>$file</em></h1>";
    }
?>

Speichern Sie das oben als download.php.

Speichern Sie dieses kleine Snippet als PHP -Datei irgendwo auf Ihrem Server. Sie können damit eine Datei im Browser herunterladen und nicht direkt anzeigen. Wenn Sie andere Dateien als PDF bereitstellen möchten, entfernen oder bearbeiten Sie die Zeile 5.

Sie können es wie folgt verwenden:

Fügen Sie der HTML-Datei den folgenden Link hinzu.

<a href="download.php?file=my_pdf_file.pdf">Download the cool PDF.</a>

Referenz von: Dieses Blog

5
Ashay

Geben Sie einfach den untenstehenden Code in Ihre .htaccess-Datei ein:

AddType application/octet-stream .csv
AddType application/octet-stream .xls
AddType application/octet-stream .doc
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .mov
AddType application/octet-stream .pdf

Oder Sie können auch einen Trick über JavaScript ausführen

element.setAttribute( 'download', whatever_string_you_want);
4
manish1706

Ich habe das gerade benutzt, aber ich weiß nicht, ob es in allen Browsern funktioniert.

Es funktioniert in Firefox:

<a href="myfile.pdf" download>Click to Download</a>
4
NowLiveLove

Wenn Sie den Download für einen einzelnen Link auf Ihrer Seite erzwingen möchten, können Sie dies ganz einfach tun, indem Sie das HTML5-Download-Attribut im href-Link verwenden.

Siehe: http://davidwalsh.name/download-attribute

damit können Sie die vom Benutzer heruntergeladene Datei umbenennen und gleichzeitig den Download erzwingen.

Es gab eine Debatte darüber, ob dies eine gute Praxis ist oder nicht, aber in meinem Fall habe ich einen eingebetteten Viewer für eine PDF-Datei, und der Viewer bietet keinen Download-Link an, daher muss ich einen separaten bereitstellen. Hier möchte ich sicherstellen, dass der Benutzer das PDF nicht im Webbrowser öffnet, was verwirrend wäre.

Das Speichern unter-Dialogfeld wird nicht erforderlich geöffnet, der Link wird jedoch direkt zum voreingestellten Download-Ziel heruntergeladen. Natürlich ist es wahrscheinlich eine schlechte Idee, wenn Sie eine Website für eine andere Person erstellen und sie manuell Attribute in ihre Links einschreiben müssen. Wenn das Attribut jedoch in die Links aufgenommen werden kann, kann dies eine leichte Lösung sein.

3
Julius

Eine wirklich einfache Möglichkeit, dies zu erreichen, ohne externe Download-Sites zu verwenden oder Header usw. zu ändern, besteht darin, einfach eine Zip-Datei mit dem darin enthaltenen PDF zu erstellen und direkt auf die Zip-Datei zu verlinken. Dies wird IMMER das Dialogfeld "Speichern/Öffnen" auslösen, und es ist für Benutzer immer noch einfach, auf das Fenster "PDF" zu doppelklicken, in dem das mit .Zip verknüpfte Programm gestartet wird.

Übrigens eine gute Frage, ich habe auch nach einer Antwort gesucht, da die meisten im Browser eingebetteten PDF Plugins so lange brauchen, um etwas anzuzeigen (und den Browser oft hängen lassen, während das PDF geladen wird ).

3
Mr. Bungle

Eine serverseitige Lösung ist mehr kompatibel, bis das Attribut "download" in allen Browsern implementiert ist.

Ein Python-Beispiel könnte ein benutzerdefinierter HTTP-Anforderungshandler für einen Dateispeicher sein. Die Links, die auf den Dateispeicher zeigen, werden folgendermaßen generiert:

http://www.myfilestore.com/filestore/13/130787e71/download_as/desiredName.pdf

Hier ist der Code:

class HTTPFilestoreHandler(SimpleHTTPRequestHandler):

    def __init__(self, fs_path, *args):
        self.fs_path = fs_path                          # Filestore path
        SimpleHTTPRequestHandler.__init__(self, *args)

    def send_head(self):
        # Overwrite SimpleHTTPRequestHandler.send_head to force download name
        path = self.path
        get_index = (path == '/')
        self.log_message("path: %s" % path)
        if '/download_as/' in path:
            p_parts = path.split('/download_as/')
            assert len(p_parts) == 2, 'Bad download link:' + path
            path, download_as = p_parts
        path = self.translate_path(path )
        f = None
        if os.path.isdir(path):
            if not self.path.endswith('/'):
                # Redirect browser - doing basically what Apache does
                self.send_response(301)
                self.send_header("Location", self.path + "/")
                self.end_headers()
                return None
            else:
                return self.list_directory(path)
        ctype = self.guess_type(path)
        try:
            f = open(path, 'rb')
        except IOError:
            self.send_error(404, "File not found")
            return None
        self.send_response(200)
        self.send_header("Content-type", ctype)
        fs = os.fstat(f.fileno())
        self.send_header("Expires", '0')
        self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
        self.send_header("Cache-Control", 'must-revalidate, post-check=0, pre-check=0')
        self.send_header("Content-Transfer-Encoding", 'binary')
        if download_as:
            self.send_header("Content-Disposition", 'attachment; filename="%s"' % download_as)
        self.send_header("Content-Length", str(fs[6]))
        self.send_header("Connection", 'close')
        self.end_headers()
        return f


class HTTPFilestoreServer:

    def __init__(self, fs_path, server_address):
        def handler(*args):
            newHandler = HTTPFilestoreHandler(fs_path, *args)
            newHandler.protocol_version = "HTTP/1.0"
        self.server = BaseHTTPServer.HTTPServer(server_address, handler)

    def serve_forever(self, *args):
        self.server.serve_forever(*args)


def start_server(fs_path, ip_address, port):
    server_address = (ip_address, port)
    httpd = HTTPFilestoreServer(fs_path, server_address)

    sa = httpd.server.socket.getsockname()
    print "Serving HTTP on", sa[0], "port", sa[1], "..."
    httpd.serve_forever()
2
yucer

Nach dem Dateinamen im HTML-Code füge ich ?forcedownload=1 hinzu.

Dies war die einfachste Möglichkeit, ein Dialogfeld zum Speichern oder Herunterladen auszulösen.

0
Bonnie

Dies ist ein alter Beitrag, aber hier ist die meine Lösung in JavaScript, die jQuery-Bibliothek verwendet.

<script>
(function($){
    var download = [];
    $('a.force-download, .force-download a').each(function(){
        // Collect info
        var $this = $(this),
            $href = $this.attr('href'),
            $split = $href.split('/'),
            $name = document.title.replace(/[\W_]/gi, '-').replace(/-{2,}/g, '-'); // get title and clean it for the URL

        // Get filename from URL
        if($split[($split.length-1)])
        {
            $tmp = $split[($split.length-1)];
            $tmp = $tmp.split('.');
            $name = $tmp[0].replace(/[\W_]/gi, '-').replace(/-{2,}/g, '-');
        }

        // If name already exists, put timestamp there
        if($.inArray($name, download) > -1)
        {
            $name = $name + '-' + Date.now().replace(/[\W]/gi, '-');
        }

        $(this).attr("download", $name);
        download.Push($name);
    });
}(jQuery || window.jQuery))
</script>

Sie müssen nur die Klasse force-download in Ihrem <a>-Tag verwenden und werden den Download automatisch erzwingen. Sie können es auch dem übergeordneten div hinzufügen und alle darin enthaltenen Links übernehmen.

Beispiel:

<a href="/some/good/url/Post-Injection_Post-Surgery_Instructions.pdf" class="force-download" target="_blank">Download PDF</a>

Dies ist ideal für WordPress und andere Systeme oder benutzerdefinierte Websites.

Ich hatte gerade ein sehr ähnliches Problem mit dem hinzugefügten Problem, das ich brauchte, um Download-Links zu Dateien in einer Zip-Datei zu erstellen.

Ich habe zuerst versucht, eine temporäre Datei zu erstellen, und habe dann einen Link zu der temporären Datei bereitgestellt, aber ich habe festgestellt, dass einige Browser nur den Inhalt (eine CSV-Excel-Datei) anzeigen, anstatt das Herunterladen anzubieten. Schließlich fand ich die Lösung mit einem Servlet. Es funktioniert sowohl bei Tomcat als auch bei GlassFish, und ich habe es bei Internet Explorer 10 und Chrome versucht.

Das Servlet nimmt einen vollständigen Pfadnamen für die Zip-Datei und den Namen der Datei in der Zip-Datei, die heruntergeladen werden soll.

In meiner JSP-Datei habe ich eine Tabelle, in der alle Dateien in der Zip-Datei angezeigt werden. Links dazu heißt es: onclick='download?zip=<%=Zip%>&csv=<%=csv%>'

Der Servlet-Code befindet sich in download.Java:

package myServlet;

import Java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import Java.util.Zip.*;
import Java.util.*;

// Extend HttpServlet class
public class download extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        PrintWriter out = response.getWriter(); // now we can write to the client

        String filename = request.getParameter("csv");
        String zipfile = request.getParameter("Zip");

        String aLine = "";

        response.setContentType("application/x-download");
        response.setHeader( "Content-Disposition", "attachment; filename=" + filename); // Force 'save-as'
        ZipFile Zip = new ZipFile(zipfile);
        for (Enumeration e = Zip.entries(); e.hasMoreElements();) {
            ZipEntry entry = (ZipEntry) e.nextElement();
            if(entry.toString().equals(filename)) {
                InputStream is = Zip.getInputStream(entry);
                BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"), 65536);
                while ((aLine = br.readLine()) != null) {
                    out.println(aLine);
                }
                is.close();
                break;
            }
        }
    }
}

Zum Kompilieren auf Tomcat benötigen Sie den Klassenpfad, um Tomcat\lib\servlet-api.jar oder GlassFish einzufügen: glassfish\lib\j2ee.jar

Aber beide werden an beiden arbeiten. Sie müssen auch Ihr Servlet in web.xml setzen.

0
mljm

Wenn Sie ein Plugin im Browser haben, das weiß, wie eine PDF -Datei geöffnet wird, wird es direkt geöffnet. Wie bei Bildern und HTML-Inhalten.

Der alternative Ansatz ist also, Ihren MIME-Typ nicht in der Antwort zu senden. Auf diese Weise weiß der Browser nie, welches Plugin es öffnen soll. Daher wird ein Dialogfeld Speichern/Öffnen angezeigt.

0
sushil bharwani