Perché a volte Chrome scarica un PDF invece di aprirlo? [duplicare]


125

Quando vado a determinati indirizzi di file PDF, Chrome scarica il PDF invece di aprirlo utilizzando il suo visualizzatore PDF incorporato. La pagina è quindi bianca vuota.

Non ci sono problemi con le mie impostazioni di Chrome: provo gli indirizzi di altri file PDF e Chrome si comporta come previsto (l'ho impostato per utilizzare il visualizzatore PDF incorporato di Chrome). Ma ogni volta che provo lo stesso indirizzo problematico, Chrome scarica il PDF e quindi visualizza una pagina vuota.

Sto usando Windows 10 e Chrome Version 63.0.3239.84 (Official Build) (64-bit).

Il mio specifico URL problematico questa volta è qui (un risultato di ricerca di Google).

Risposte:


159

Fondamentalmente, questo accade perché il sito web dice al browser di farlo. Occasionalmente, è perché lo sviluppatore del sito web decide di voler questo comportamento, ad esempio comune sui siti di condivisione di file. Altre volte, è perché è un'opzione predefinita per qualsiasi software in uso (ad es. Forum o software di blog). A volte è perché lo sviluppatore del sito non ha idea di cosa stiano facendo.


Content-Disposition

Questo di solito perché il sito invia Content-Dispositionun'intestazione nella risposta. In particolare, può inviare inlineo attachment.

inline è l'impostazione predefinita se non diversamente specificato e indica che il browser aprirà il file all'interno della finestra del browser se è in grado di farlo.

attachment significa scaricare sempre il file, non tentare mai di aprirlo all'interno del browser.


Se apri gli strumenti di sviluppo del tuo browser, vedrai che quel particolare link invia le seguenti intestazioni di risposta:

Content-Disposition: attachment; filename="Schubert-Sonata-21-B-flat.pdf"
Content-Type: application/pdf

Questo dice al browser di scaricare sempre ( attachment) il file e di assegnargli il nome file predefinito Schubert-Sonata-21-B-flat.pdfanziché dedurlo dall'URL. Inoltre, dice al browser (correttamente) che si tratta di un application/pdffile, ma dal momento che è un attachmentbrowser il download sarà comunque predefinito.


Dettagli di gestione in linea

Quando a Content-Dispositionè inline (o non specificato), il browser tenterà di aprire il file nel visualizzatore incorporato predefinito. Funziona solo quando il browser conosce il tipo di file e il browser sa come aprire quel tipo.

Rilevazione del tipo

Il tipo di file può essere specificato dal server con Content-Typeun'intestazione. Ad esempio, i tipi più comuni sono in linea text/html, application/javascripte text/css, che costituiscono le tre parti principali di un sito web moderno. Puoi anche avere più tipi esoterici come application/pdf.

Un'altra possibilità è che il server abbia specificato un Content-Typedi application/octet-stream. Questo è il tipo più generico e dice al browser che il file è solo un dato arbitrario - a quel punto l'unica cosa che il browser può fare è scaricarlo (in teoria - ci arriveremo).

Quando a Content-Typenon è specificato dal server (e talvolta anche quando lo è), il browser può eseguire ciò che è noto come sniffing per provare a indovinare il tipo leggendo il file e cercando schemi.

Tipo di gestione

Alla ricezione di un file con una inlinedisposizione o non specificata, il browser deve tentare di aprirlo all'interno del browser, se possibile. Per fare ciò, esamina il tipo di file e se riconosce il tipo tenterà di aprirlo. La maggior parte dei browser aprirà qualsiasi text/tipo in un semplice visualizzatore di testo, proverà a eseguire il rendering text/htmlcome pagina Web, potrebbe aprirsi application/jsonin uno speciale visualizzatore evidenziato dalla sintassi , ecc.

Il tipo è application/octet-streamstato gestito appositamente. Dal momento che si suppone che sia il tipo più generico, che indica un flusso arbitrario di byte, non si suppone che ci sia alcun gestore che possa essere applicato a tutti i file di questo "tipo". Ad esempio, in Firefox, questo si manifesta come incapacità di impostare il gestore predefinito per application/octet-stream.

Alcuni siti Web hanno utilizzato anche tipi non standard. Ho visto application/force-downloadusato - che finisce come un download perché il browser non riconosce o sa cos'altro fare con il tipo, ma non gode della speciale gestione che application/octet-streamfa.


Un po 'di lezione di storia

Per vedere come vengono gestiti i PDF, possiamo approfondire un po 'la cronologia web. Vedi, in passato i browser non avevano idea di cosa fosse un PDF. Quindi non potevano aprirlo. Ma abbiamo visto che i PDF venivano aperti nei browser molto prima che i visualizzatori PDF integrati fossero una cosa, quindi come funzionava?

In passato era possibile estendere le funzionalità del browser con un controllo molto maggiore di quello che si può fare con estensioni / componenti aggiuntivi limitati in questi giorni. Quelli erano genericamente conosciuti come plugin . In Internet Explorer, erano controlli ActiveX; in Mozilla Firefox e successivamente Google Chrome erano plugin NPAPI. Questi plugin erano in grado di fare tutto ciò che qualsiasi altro programma poteva, e potevano anche registrarsi come gestori per un tipo di file specifico che potrebbe altrimenti non essere riconosciuto dal browser. (Per inciso, questo è stato successivamente scoperto essere un enorme rischio per la sicurezza e il supporto per questi potenti plugin è stato gradualmente eliminato ...)

Ai giorni dei plug-in, avresti installato Adobe Acrobat Reader, che avrebbe quindi installato un plug-in ActiveX o NPAPI che avrebbe registrato il application/pdftipo MIME e avrebbe detto al browser di aprire quei tipi in linea usando il plug-in.

Naturalmente, dopo una serie di problemi di sicurezza e prestazioni causati da questi plug-in, i principali produttori di browser hanno deciso di incorporare i propri visualizzatori di PDF eliminando gradualmente il supporto per la maggior parte dei plug-in. L'unico che vediamo ancora è Adobe Shockwave Flash, che gestisce application/x-shockwave-flash.

In realtà ci sono ancora alcuni controlli rimanenti per questo, ad esempio in Firefox l' Preview in Firefoxopzione esiste ancora:

Schermata dell'opzione

In passato, ciò avrebbe consentito la scelta tra più plugin che registravano quel tipo. Ad esempio, l'elenco dei tipi registrati per Flash:

Schermata dei tipi registrati

Quei giorni erano anche molto prima del supporto mediatico fornito con HTML5. Non erano solo PDF: il tuo browser non avrebbe idea di come gestire un contenitore MP4 o video H.264, non avesse idea di come riprodurre un file MP3, ecc., Ecc. Vedresti plug-in forniti da lettori multimediali come VLC o anche Windows Media Player, oppure i siti Web incorporerebbero un lettore multimediale incorporato in Flash.


A volte succede anche quando il server si imposta Content-Type: application/octet-streamma è molto meno comune in questi giorni.
Michael Hampton,

2
Il motivo per cui vengono utilizzati i valori "inline" e "allegato" è perché Content-Disposition è stato originariamente specificato per l'e-mail MIME, dove tali valori sono molto più appropriati :)
hobbs

@hobbs: Quasi un caso di studio sulla terminologia specifica del dominio nella tecnologia riutilizzabile quando qualcosa di più astratto farà ^ _ ^
Razze di leggerezza in orbita,

23

Ho trovato una spiegazione Secondo una risposta che ho trovato , sembra che Chrome scaricherà un file PDF se il tipo di contenuto MIME è impostato per non application/pdfma piuttosto un "tipo MIME corretto o generico", application/octet-stream.

Inoltre , "La maggior parte dei server Web invia risorse di tipo sconosciuto utilizzando il application/octet-streamtipo MIME predefinito . Per motivi di sicurezza, la maggior parte dei browser non consente di impostare un'azione predefinita personalizzata per tali risorse, costringendo l'utente a memorizzarlo su disco per utilizzarlo."


3
In effetti, questa logica ha la precedenza sulla disposizione dei contenuti ed è quindi importante ricordare.
Razze di leggerezza in orbita il

@LightnessRacesinOrbit Non sovrascrive così tanto la disposizione in quanto fornisce al browser un tipo con cui non può fare nulla (salvo lo sniffing) diverso dal salvataggio su disco. Concesso, l'effetto visibile è lo stesso.
Bob,

@Bob: Okay, sì, questa è una buona interpretazione
Lightness Races in Orbit il

20

Ciò è dovuto al HTTP Content-Dispositionintestazione specificando che il file è un attaccamento . Questo indica al browser di scaricare il file, piuttosto che aprirlo direttamente.

Esiste un componente aggiuntivo di Chrome che può ignorare questo comportamento. L'immagine seguente proviene dagli strumenti per sviluppatori di Firefox:

Richiesta HTTP come visto negli strumenti di sviluppo di Firefox


Posso chiedere se esiste anche un componente aggiuntivo simile per Firefox?
Davyjones,

3
@davyjones Puoi. Per non dover chiedere se esiste un componente aggiuntivo per Firefox, eccone uno.
wizzwizz4,

1
Quel plug-in sembra non funzionare più
Paul Slocum,
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.