it-swarm.com.de

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

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 eingebettete Tag und einen iframe zu verwenden, aber es funktioniert nur, wenn diese Option aktiviert ist.

Was kann ich machen?

170
elloalisboa

Um dem Browser anzuzeigen, dass die Datei im Browser angezeigt werden soll:

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, z. B. filename[1].pdf, die die Fähigkeit des Browsers, die Antwort zu bearbeiten, andernfalls beeinträchtigen könnte.

340
ColinM

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

Zum Beispiel,

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

Hier ist filename optional, aber wenn angegeben, wird dieser Name für die heruntergeladene Datei verwendet.

20
Akshay

Der richtige Typ ist application/pdf fü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:

  • Forced Download/Prompt: Verwenden Sie header("Content-Disposition", "attachment; filename=myfilename.myextension");
  • Browser versucht, es zu öffnen: use header("Content-Disposition", "inline; filename=myfilename.myextension");

Keine Kontrolle über den Servercode:

  • Verwenden Sie das HTML5-Downloadattribut . Es verwendet den benutzerdefinierten Dateinamen, der auf der Ansichtsseite angegeben ist.

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

13

Wenn Sie Apache haben, fügen Sie dies der .htaccess-Datei hinzu:

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

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 auffordert, verwenden Sie "Inline" für die dritte Zeichenfolge anstelle von "Anhang". Inline funktioniert sehr gut. Die PDF wird sofort angezeigt, ohne dass der Benutzer auf Öffnen klicken muss. Ich habe "Anhang" verwendet und dies fordert den Benutzer zum Öffnen und Speichern auf. Ich habe versucht, die Browsereinstellung zu ändern. Die Aufforderung wird dadurch nicht verhindert.

2
trangsinh1952

Dies ist für ASP.NET MVC

In 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");
    }
0
Leon van Wyk