Wie erzwinge ich das Öffnen von Dateien im Browser, anstatt sie herunterzuladen (PDF)?

208

Gibt es eine Möglichkeit, das Öffnen von PDF-Dateien im Browser zu erzwingen, wenn die Option "PDF im Browser anzeigen" deaktiviert ist?

Ich habe versucht, das Einbettungs-Tag und einen Iframe zu verwenden, aber es funktioniert nur, wenn diese Option aktiviert ist.

Was kann ich tun?

elloalisboa
quelle

Antworten:

417

Um dem Browser anzuzeigen, dass die Datei im Browser angezeigt werden soll, sollte die HTTP- Antwort folgende Header enthalten:

Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"

So laden Sie die Datei herunter, anstatt sie anzuzeigen:

Content-Type: application/pdf
Content-Disposition: attachment; filename="filename.pdf"

Die Anführungszeichen um den Dateinamen sind erforderlich, wenn der Dateiname Sonderzeichen enthält, filename[1].pdfdie andernfalls die Fähigkeit des Browsers beeinträchtigen können, die Antwort zu verarbeiten.

Wie Sie die HTTP-Antwortheader festlegen, hängt von Ihrem HTTP-Server ab (oder, wenn Sie die PDF-Antwort aus serverseitigem Code generieren: Ihrer serverseitigen Programmiersprache).

ColinM
quelle
13
Um den Download zu erzwingen, verwende ich lieber Content-Type: application / octet-stream.
Papick G. Taboada
25
@ PapickG.Taboada, aber dann kennt das System des Benutzers möglicherweise nicht den Dateityp. Einige Benutzer haben sich möglicherweise für "Dateien dieses Typs immer öffnen" für PDF-Dateien entschieden. Wenn Sie die Einstellungen des Benutzers überschreiben möchten, ist Octet-Stream möglicherweise der richtige Weg, aber die Angabe des richtigen Typs und eines vorgeschlagenen Dateinamens ist der "richtige" Weg, um einen Download bereitzustellen.
ColinM
2
hi @ColinM Ich bin hier etwas verwirrt ... wir haben Probleme beim Rendern des PDFs, es gibt nur einen verschlüsselten Text. Wo setzen wir den Inhaltstyp: application / pdf Content-Disposition: inline; "Dateiname.pdf"? Weil wir es mit Angular-Js-Code hochladen. Meine Frage ist also, ob der Inhaltstyp vor dem Hochladen festgelegt werden soll. Außerdem erhalten wir nur einen Link vom Backend-Team, eine URL, die den Dateipfad angibt, den wir in einem neuen Tab öffnen, indem wir Folgendes verwenden: window.open (url, '_blank'). Focus ();
Kailas
3
@Kailas Ich verstehe nicht, was Sie versuchen zu tun. Die Antwort bezieht sich auf die Header, die ein Server an einen Client senden sollte, wenn er auf eine HTTP-Anfrage für die PDF-Datei antwortet. Diese Header haben keine Auswirkung auf das Hochladen von Dateien. Der Code hinter der URL muss die Header jedes Mal festlegen, wenn sie vom Client heruntergeladen werden.
ColinM
1
@ColinM Danke Kumpel, du hast es richtig gesagt, das Problem beim Debuggen war, dass der MIME-Typ beim Hochladen der Dateien festgelegt wurde. Dies sollte vom Back-End-Team durchgeführt werden. Ich habe versucht, Codes zum Hinzufügen von Headern in Java-Skripten abzurufen, war jedoch nicht erfolgreich. Danke, als ich die eigentliche Idee von dir geklärt habe ... :)
Kailas
19

Wenn Sie HTML5 verwenden (und ich denke, dass heutzutage jeder das verwendet), gibt es ein Attribut namens download.

Beispielsweise,

<a href="somepathto.pdf" download="filename">

Hier filenameist optional, aber falls angegeben, wird dieser Name für die heruntergeladene Datei verwendet.

Akshay
quelle
2
Wenn Sie die Kontrolle über den Servercode haben, sollten Sie "Anhang" verwenden, da dies die Verwendung des gleichen Codes zur Generierung von Dateinamen ermöglicht. Wenn Sie keine Kontrolle über den Server haben, ist dies eine gute Lösung.
Christophe Roussy
Dies ist eine brillante Lösung für das Problem, aber wie immer hält uns der IE davon ab, es zu verwenden: caniuse.com/#search=download
Rory McCrossan
1
Es ist wichtig zu beachten, dass dies nicht domänenübergreifend funktioniert (z. B. stört die Richtlinie mit demselben Ursprung). Beim Herunterladen von einer Domain funktioniert das Download-Attribut nicht, wenn Inhalte in einer anderen Domain gespeichert sind. CORS kann zulassen, dass dieser Inhalt durchgelassen wird (noch nicht getestet).
Vol7ron
59
Dies ist buchstäblich das Gegenteil von dem, was das OP verlangt :)
Chuck Le Butt
1
Ja gedacht! : \ Ich habe die Frage falsch verstanden und beantwortet. Aber viele Leute landen hier und finden nur das Gegenteil. Deshalb wird die Antwort nicht bearbeitet / entfernt.
Akshay
16

Der richtige Typ ist application/pdffür PDF, nicht application/force-download. Dies sieht für einige ältere Browser wie ein Hack aus. Verwenden Sie immer den richtigen Mimetyp, wenn Sie können.

Wenn Sie die Kontrolle über den Servercode haben:

  • Erzwungener Download / Eingabeaufforderung: Verwenden header("Content-Disposition", "attachment; filename=myfilename.myextension");
  • Browser versucht es zu öffnen: verwenden header("Content-Disposition", "inline; filename=myfilename.myextension");

Keine Kontrolle über den Servercode:

  • Verwenden Sie das HTML5-Download-Attribut . Es wird der auf der Ansichtsseite angegebene benutzerdefinierte Dateiname verwendet.

HINWEIS: Ich bevorzuge es, den Dateinamen auf der Serverseite festzulegen, da Sie möglicherweise mehr Informationen haben und allgemeinen Code verwenden können.

Christophe Roussy
quelle
2

Wenn Sie Apache haben, fügen Sie dies der .htaccessDatei hinzu:

<FilesMatch "\.(?i:pdf)$">
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</FilesMatch>
Alex
quelle
Wie können wir mehrere Erweiterungen hinzufügen? Ich möchte auch die DOC- und XLS-Erweiterung hinzufügen. Bitte schlagen Sie mich vor. Danke im Voraus.
Kamlesh
Das macht das Gegenteil von dem, was verlangt wird
Quentin
1

Hoppla, in meinem vorherigen Beitrag gab es Tippfehler.

    header("Content-Type: application/force-download");
    header("Content-type: application/pdf");
    header("Content-Disposition: inline; filename=\"".$name."\";");

Wenn Sie nicht möchten, dass der Browser den Benutzer dazu auffordert, verwenden Sie "inline" für die dritte Zeichenfolge anstelle von "Anhang". Inline funktioniert sehr gut. Die PDF-Anzeige wird sofort angezeigt, ohne dass der Benutzer aufgefordert wird, auf Öffnen zu klicken. Ich habe "Anhang" verwendet und dies fordert den Benutzer zum Öffnen, Speichern auf. Ich habe versucht, die Browser-Einstellungsmutter zu ändern, die die Eingabeaufforderung nicht verhindert.

trangsinh1952
quelle
4
Welcher vorherige Beitrag?
Peter Mortensen
0

Dies ist für ASP.NET MVC

Auf Ihrer cshtml-Seite:

<section>
    <h4><a href="@Url.Action("Download", "Document", new { id = @Model.GUID })"><i class="fa fa-download"></i> @Model.Name</a></h4>
    <object data="@Url.Action("View", "Document", new { id = @Model.GUID })" type="application/pdf" width="100%" height="800" class="col-md-12">
        <h2>Your browser does not support viewing PDFs, click on the link above to download the document.</h2>
    </object>
</section>

In Ihrem Controller:

public ActionResult Download(Guid id)
    {
        if (id == Guid.Empty)
            return null;

        var model = GetModel(id);

        return File(model.FilePath, "application/pdf", model.FileName);
    }

public FileStreamResult View(Guid id)
    {
        if (id == Guid.Empty)
            return null;

        var model = GetModel(id);

        FileStream fs = new FileStream(model.FilePath, FileMode.Open, FileAccess.Read);

        return File(fs, "application/pdf");
    }
Leon van Wyk
quelle
-1

Während das Folgende unter Firefox gut funktioniert, funktioniert es NICHT unter Chrome und mobilen Browsern.

Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"

Gehen Sie wie folgt vor, um den Fehler bei Chrome- und mobilen Browsern zu beheben:

  • Speichern Sie Ihre Dateien in einem Verzeichnis in Ihrem Projekt
  • Verwenden Sie den Google PDF Viewer

Google PDF Viewer kann folgendermaßen verwendet werden:

<iframe src="http://docs.google.com/gview?url=http://example.com/path/to/my/directory/pdffile.pdf&embedded=true" frameborder="0"></iframe>
Nick Kongk.
quelle
-4

Öffnen Sie downloads.php aus der Root-Datei.

Gehen Sie dann zu Zeile 186 und ändern Sie sie wie folgt:

        if(preg_match("/\.jpg|\.gif|\.png|\.jpeg/i", $name)){
            $mime = getimagesize($download_location);
            if(!empty($mime)) {
                header("Content-Type: {$mime['mime']}");
            }
        }
        elseif(preg_match("/\.pdf/i", $name)){
            header("Content-Type: application/force-download");
            header("Content-type: application/pdf");
            header("Content-Disposition: inline; filename=\"".$name."\";");
        }

        else{
            header("Content-Type: application/force-download");
            header("Content-type: application/octet-stream");
            header("Content-Disposition: attachment; filename=\"".$name."\";");
        }
Christian Felix Kazuya
quelle
7
Keine Erwähnung, dass sie PHP verwenden. Was ist, wenn sich das Backend in Python oder .NET befindet?
Maxime Rouiller
1
... über außerhalb des linken Feldes sprechen. Er sagt nicht einmal, über welchen Rahmen er spricht.
Archonic
-4

Sie können dies folgendermaßen tun:

<a href="path to PDF file">Open PDF</a>

Wenn sich die PDF-Datei in einem Ordner befindet und dieser Ordner nicht berechtigt ist, direkt auf Dateien in diesem Ordner zuzugreifen, müssen Sie einige Dateizugriffsbeschränkungen mithilfe der .htaccessDateieinstellung auf folgende Weise umgehen :

<FilesMatch ".*\.(jpe?g|JPE?G|gif|GIF|png|PNG|swf|SWF|pdf|PDF)$" >
    Order Allow,Deny
    Allow from all
</FilesMatch>

Erlauben Sie jetzt aber nur bestimmte notwendige Dateien.

Ich habe diesen Code verwendet und er hat perfekt funktioniert.

Mohsin
quelle
Keine Erwähnung, dass sie Apache verwenden. Was ist, wenn sie IIS verwenden? Oder Express?
Maxime Rouiller
-7

Entweder verwenden

<embed src="file.pdf" />

Wenn das Einbetten eine Option oder mein neues Plugin ist, PIFF: https://github.com/terrasoftlabs/piff

Gabriel Ryan Nahmias
quelle
-7

Hier ist eine andere Methode, um das Anzeigen einer Datei im Browser in PHP zu erzwingen:

$extension = pathinfo($file_name, PATHINFO_EXTENSION);
$url = 'uploads/'.$file_name;
        echo '<html>'
                .header('Content-Type: application/'.$extension).'<br>'
                .header('Content-Disposition: inline; filename="'.$file_name.'"').'<br>'
                .'<body>'
                .'<object   style="overflow: hidden; height: 100%;
             width: 100%; position: absolute;" height="100%" width="100%" data="'.$url.'" type="application/'.$extension.'">
                    <embed src="'.$url.'" type="application/'.$extension.'" />
             </object>'
            .'</body>'
            . '</html>';
user28864
quelle
1
headerfunktioniert nicht, nachdem Sie mit der Ausgabe des Anforderungshauptteils begonnen haben (und es wird keine Zeichenfolge zum Verketten in einem HTML-Dokument zurückgegeben)
Quentin
-9

Öffnen Sie einfach Adobe Reader, Menü → BearbeitenEinstellungenInternet , wechseln Sie in den Browsermodus oder versuchen Sie, detaillierte Anweisungen in verschiedenen Browsern anzuzeigen, PDF im Browser anzeigen | Acrobat, Acrobat Reader .

lawl
quelle
3
Was ist, wenn Sie AdobeReader oder Windows nicht verwenden? Deine Antwort wird nicht funktionieren. Darüber hinaus muss der Benutzer aufgefordert werden, seine Einstellungen zu ändern, was in der realen Welt nicht möglich ist.
Klauenfeuer
-12

Wenn Sie eine Verknüpfung zu einer PDF-Datei herstellen, wird diese im Browser geöffnet.
Wenn das Kontrollkästchen deaktiviert ist, sollte eine Verknüpfung zu einer ZIP-Datei hergestellt werden, um den Download zu erzwingen.

Wenn eine ZIP-Datei keine Option ist, verwenden Sie Header in PHP, um den Download zu erzwingen

header('Content-Type: application/force-download'); 
header('Content-Description: File Transfer'); 
Kirk Strobeck
quelle
Ja, aber ich brauche eine Möglichkeit, um das Öffnen im Browser zu erzwingen und nicht herunterzuladen. Ich habe keine Ahnung, ob es möglich ist.
elloalisboa
2
Wenn Sie das Herunterladen nicht erzwingen, erzwingen Sie das Öffnen im Browser. Wenn es nicht im Browser geöffnet wird, hat der Benutzer bestimmte Einstellungen, die Sie nicht überschreiben können, oder er verfügt nicht über eine PDF-Lesesoftware.
Kirk Strobeck
1
Eigentlich siehe meine Antwort.
Gabriel Ryan Nahmias
21
Das ist falsch. Es gibt keine Anwendung / Force-Download. Sie können auch alskjdsdjk / aljksdlasdj verwenden. Der Browser wird heruntergeladen, da er diesen MIME-Typ nicht kennt. Der richtige MIME-Typ zum Download würde mir Anwendung / Oktett-Stream
Papick G. Taboada