Come forzare l'apertura dei file nel browser anziché il download (PDF)?


210

C'è un modo per forzare l'apertura dei file PDF nel browser quando l'opzione "Visualizza PDF nel browser" è deselezionata?

Ho provato a usare il tag embed e un iframe, ma funziona solo quando questa opzione è selezionata.

Cosa posso fare?

Risposte:


419

Per indicare al browser che il file deve essere visualizzato nel browser, la risposta HTTP dovrebbe includere queste intestazioni:

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

Per scaricare il file anziché visualizzarlo:

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

Le virgolette intorno al nome del file sono necessarie se il nome del file contiene caratteri speciali come quelli filename[1].pdfche potrebbero altrimenti compromettere la capacità del browser di gestire la risposta.

Il modo in cui imposti le intestazioni di risposta HTTP dipenderà dal tuo server HTTP (o, se stai generando la risposta PDF dal codice lato server: il tuo linguaggio di programmazione lato server).


13
Per forzare il download preferisco usare Content-Type: application / octet-stream.
Papick G. Taboada,

25
@ PapickG.Taboada ma il sistema dell'utente potrebbe non conoscere il tipo di file. Ad esempio, alcuni utenti potrebbero aver scelto "Apri sempre file di questo tipo" per i file PDF. Forse se vuoi sovrascrivere le preferenze dell'utente, allora octet-stream sarebbe la strada da percorrere, ma dare il tipo corretto e un nome file suggerito è il modo "corretto" per fornire un download.
ColinM,

2
ciao @ColinM Sono un po 'confuso qui ... stiamo riscontrando problemi nel rendering del pdf, dà solo un testo criptato. dove impostiamo il Content-Type: application / pdf Content-Disposition: inline; "filename.pdf"? quindi, lo carichiamo usando il codice angular-js. Quindi la mia domanda è: il tipo di contenuto deve essere impostato prima del caricamento? Inoltre, riceviamo solo un link dal team di backend, un URL che fornisce il percorso del file, che apriamo in una nuova scheda usando: window.open (url, '_blank'). Focus ();
Kailas,

3
@Kailas Non capisco cosa stai cercando di fare .. La risposta si riferisce alle intestazioni che un server dovrebbe inviare a un client quando risponde a una richiesta HTTP per il file PDF. Queste intestazioni non hanno alcun effetto sul caricamento di un file, è necessario che il codice dietro l'URL imposti le intestazioni ogni volta che viene scaricato dal client.
ColinM,

1
@ColinM Grazie amico, hai detto bene, il problema quando abbiamo eseguito il debug è stato impostato il tipo mime durante il caricamento dei file. Questo dovrebbe essere fatto dal team di back-end. Ho cercato di ottenere codici su come aggiungere le intestazioni nello script java ma non ci sono riuscito. Grazie, quando mi è stata chiarita la vera idea da te ... :)
Kailas,

19

Se stai usando HTML5 (e suppongo che al giorno d'oggi tutti lo usino), c'è un attributo chiamato download.

Per esempio,

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

Qui filenameè facoltativo, ma se fornito, prenderà questo nome per il file scaricato.


2
Se hai il controllo sul codice del server, dovresti usare 'attachement' in quanto ciò consentirà di usare lo stesso codice di generazione del nome file. Se non hai alcun controllo sul server, questa è una buona soluzione.
Christophe Roussy,

Questa è una brillante soluzione al problema, tuttavia, come sempre, IE ci sta trattenendo dall'utilizzarlo: caniuse.com/#search=download
Rory McCrossan il

1
È importante notare che questo non funziona su tutti i domini (ad esempio, la politica della stessa origine si frappone). Se si scarica da un dominio, l'attributo download non funzionerà se il contenuto è archiviato in un dominio diverso. CORS può consentire il passaggio di tali contenuti (non testati).
vol7ron,

59
Questo è letteralmente il contrario di ciò che l'OP chiede :)
Chuck Le Butt,

1
Sì, capito! : \ Ho capito male la domanda e ho risposto. Ma molte persone qui arrivano solo trovando il contrario, ecco perché non modificare / rimuovere la risposta.
Akshay,

16

Il tipo corretto è application/pdfper PDF, no application/force-download. Sembra un trucco per alcuni browser legacy. Se possibile, usa sempre il mimetype corretto.

Se hai il controllo sul codice del server:

  • Download / prompt forzati: utilizzare header("Content-Disposition", "attachment; filename=myfilename.myextension");
  • Il browser tenta di aprirlo: usa header("Content-Disposition", "inline; filename=myfilename.myextension");

Nessun controllo sul codice del server:

NOTA: preferisco impostare il nome file sul lato server poiché potresti avere maggiori informazioni e utilizzare un codice comune.


2

Se hai Apache aggiungilo al .htaccessfile:

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

come possiamo aggiungere più estensioni? Voglio aggiungere anche l'estensione DOC e XLS. Mi raccomando gentilmente. Grazie in anticipo.
Kamlesh,

Ciò fa il contrario di ciò che viene chiesto
Quentin,

1

Spiacenti, si sono verificati errori di battitura nel mio post precedente.

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

Se non si desidera che il browser richieda all'utente, utilizzare "inline" per la terza stringa anziché "allegato". Inline funziona molto bene. Il PDF viene visualizzato immediatamente senza chiedere all'utente di fare clic su Apri. Ho usato "allegato" e questo richiederà all'utente di aprire, salvare. Ho provato a cambiare il dado di impostazione del browser che non impedisce il prompt.


4
Quale post precedente?
Peter Mortensen,

0

Questo è per ASP.NET MVC

Nella tua pagina cshtml:

<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>

Nel tuo 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");
    }

-1

Mentre quanto segue funziona bene su Firefox, NON funziona su Chrome e browser per dispositivi mobili.

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

Per correggere l'errore dei browser Chrome e per dispositivi mobili, procedi come segue:

  • Archivia i tuoi file su una directory nel tuo progetto
  • Utilizza il Visualizzatore PDF di Google

Google PDF Viewer può essere utilizzato come segue:

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

-4

Apri downloads.php dal file root.

Quindi vai alla riga 186 e modificalo come segue:

        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."\";");
        }

7
Nessuna menzione del fatto che usano PHP. Cosa succede se il loro backend è in Python o .NET?
Maxime Rouiller il

1
... parla di fuori campo sinistro. Non dice nemmeno di quale quadro stia parlando.
Archonic,

-4

Puoi farlo nel modo seguente:

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

Se il file PDF si trova all'interno di una cartella e tale cartella non dispone dell'autorizzazione per accedere direttamente ai file in quella cartella, è necessario ignorare alcune restrizioni di accesso ai .htaccessfile utilizzando l' impostazione dei file in questo modo:

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

Ma ora consenti solo alcuni file necessari.

Ho usato questo codice e ha funzionato perfettamente.


Nessuna menzione del fatto che usano Apache. E se usano IIS? O espresso?
Maxime Rouiller il


-7

Ecco un altro metodo per forzare la visualizzazione di un file nel browser in PHP:

$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>';

1
headernon funziona dopo che hai iniziato a inviare il corpo della richiesta (e non restituisce una stringa per la concatenazione in un documento HTML)
Quentin,

-9

Basta aprire Adobe Reader, menu → ModificaPreferenzeInternet , quindi passare alla modalità browser o per istruzioni dettagliate su diversi browser, provare Visualizza PDF nel browser | Acrobat, Acrobat Reader .


3
Cosa succede se non usi AdobeReader o non usi Windows? La tua risposta non funzionerà. Inoltre, richiede di chiedere all'utente di modificare le proprie impostazioni, cosa che non è possibile eseguire nel mondo reale.
Clawfire,

-12

Se si collega a un .PDF, questo si aprirà nel browser.
Se la casella è deselezionata, dovrebbe essere collegata a un .zip per forzare il download.

Se un .zip non è un'opzione, usa le intestazioni in PHP per forzare il download

header('Content-Type: application/force-download'); 
header('Content-Description: File Transfer'); 

Sì, ma ho bisogno di un modo per forzare l'apertura nel browser per non scaricare. Non ho idea se sia possibile.
elloalisboa,

2
Se non lo stai forzando per il download, lo stai forzando per aprire nel browser. Se non si apre nel browser, è perché l'utente ha impostazioni specifiche, che non è possibile ignorare o che non dispongono di software di lettura PDF.
Kirk Strobeck,

1
In realtà, vedi la mia risposta.
Gabriel Ryan Nahmias,

21
Questo è sbagliato. Non è disponibile alcuna applicazione / download forzato. Puoi usare anche alskjdsdjk / aljksdlasdj. Il browser verrà scaricato perché non conosce questo tipo MIME. Il giusto tipo mime da scaricare mi piacerebbe application / octet-stream
Papick G. Taboada
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.