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?
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:
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].pdf
che 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).
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.
Il tipo corretto è application/pdf
per 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:
header("Content-Disposition", "attachment; filename=myfilename.myextension");
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.
Se hai Apache aggiungilo al .htaccess
file:
<FilesMatch "\.(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
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.
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");
}
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:
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>
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."\";");
}
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 .htaccess
file 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.
Utilizzare entrambi
<embed src="file.pdf" />
se l'incorporamento è un'opzione o il mio nuovo plugin, PIFF: https://github.com/terrasoftlabs/piff
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>';
header
non funziona dopo che hai iniziato a inviare il corpo della richiesta (e non restituisce una stringa per la concatenazione in un documento HTML)
Basta aprire Adobe Reader, menu → Modifica → Preferenze → Internet , quindi passare alla modalità browser o per istruzioni dettagliate su diversi browser, provare Visualizza PDF nel browser | Acrobat, Acrobat Reader .
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');