146 votes

Pourquoi Chrome télécharge-t-il parfois un PDF au lieu de l'ouvrir ?

Lorsque j'accède à certaines adresses de fichiers PDF, Chrome télécharge le PDF au lieu de l'ouvrir à l'aide de sa visionneuse PDF intégrée. La page est alors blanche et vierge.

Il n'y a aucun problème avec mes paramètres Chrome : J'essaie d'adresser d'autres fichiers PDF, et Chrome se comporte comme prévu (je l'ai configuré pour utiliser la visionneuse PDF intégrée de Chrome). Mais chaque fois que j'essaie la même adresse problématique, Chrome télécharge le PDF, puis affiche une page blanche.

J'utilise Windows 10 et Chrome Version 63.0.3239.84 (Official Build) (64-bit) .

L'URL qui me pose problème cette fois-ci est ici (résultat d'une recherche Google).

184voto

Bob Points 58080

En fait, cela se produit parce que le site Web demande au navigateur de le faire. Parfois, c'est parce que le développeur du site Web décide qu'il veut ce comportement, comme c'est le cas sur les sites de partage de fichiers. D'autres fois, c'est parce que c'est une option par défaut du logiciel qu'ils utilisent (par exemple, un forum ou un logiciel de blog). Parfois, c'est parce que le développeur du site n'a aucune idée de ce qu'il fait.


Content-Disposition

C'est généralement parce que le site envoie un Content-Disposition dans la réponse. Plus précisément, il peut envoyer soit inline o attachment .

inline est la valeur par défaut si elle n'est pas spécifiée, et signifie que le navigateur ouvrira le fichier dans la fenêtre du navigateur s'il le peut.

attachment signifie qu'il faut toujours télécharger le fichier, ne jamais essayer de l'ouvrir dans le navigateur.


Si vous ouvrez les outils de développement de votre navigateur, vous verrez que ce lien particulier envoie les en-têtes de réponse suivants :

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

Cela indique au navigateur de toujours télécharger ( attachment ) le fichier, et de lui donner le nom de fichier par défaut de Schubert-Sonata-21-B-flat.pdf plutôt que de le déduire de l'URL. De plus, il indique au navigateur (correctement) qu'il s'agit d'un fichier application/pdf mais comme il s'agit d'un fichier attachment le navigateur continuera à proposer le téléchargement par défaut.


Détails de la manipulation en ligne

Lorsqu'un Content-Disposition est en ligne (ou non spécifié), le navigateur essaiera d'ouvrir le fichier dans le visualiseur intégré par défaut. Cela ne fonctionne que si le navigateur sait de quel type de fichier il s'agit, y le navigateur sait comment ouvrir ce type.

Détection de type

Le type de fichier peut être spécifié par le serveur à l'aide de l'option Content-Type en-tête. Par exemple, les types d'en-tête les plus courants sont les suivants text/html , application/javascript y text/css qui constituent les trois parties principales d'un site web moderne. Vous pouvez également avoir des types plus ésotériques comme application/pdf .

Une autre possibilité est que le serveur ait spécifié un Content-Type de application/octet-stream . Il s'agit du type le plus générique, qui indique au navigateur que le fichier n'est qu'une donnée arbitraire. À ce stade, la seule chose que le navigateur peut faire est de le télécharger (en théorie - nous y reviendrons).

Lorsqu'un Content-Type n'est pas spécifié par le serveur (et parfois même lorsqu'il l'est), le navigateur peut effectuer ce qui est connu sous le nom de reniflant pour essayer de deviner le type en lisant le fichier et en recherchant des motifs.

Manipulation de type

Lors de la réception d'un fichier avec un inline ou une disposition non spécifiée, le navigateur doit essayer de l'ouvrir dans le navigateur si possible. Pour ce faire, il examine le type de fichier et, s'il le reconnaît, il essaie de l'ouvrir. La plupart des navigateurs ouvrent tout text/ dans un simple visualisateur de texte, essaiera de rendre text/html comme une page web, pourrait ouvrir application/json dans une visionneuse spéciale avec syntaxe mise en évidence etc.

Le type application/octet-stream a été traité de manière spéciale. Puisque c'est censé être le type le plus générique, désignant un flux arbitraire d'octets, il n'est pas censé y avoir de gestionnaire qui puisse s'appliquer à tous les fichiers de ce "type". Par exemple, dans Firefox, cela se manifeste par l'impossibilité de définir le gestionnaire par défaut para application/octet-stream .

Certains sites web ont également utilisé des types non standard. J'ai vu application/force-download utilisé - qui finit par être téléchargé parce que le navigateur ne reconnaît pas ou ne sait pas quoi faire d'autre avec le type, mais ne bénéficie pas du traitement spécial que les application/octet-stream fait.


Une petite leçon d'histoire

Pour voir comment les PDF sont traités, nous pouvons nous plonger un peu dans l'histoire du web. Vous voyez, dans le passé, les navigateurs n'avaient aucune idée de ce qu'était un PDF. Ils ne pouvaient donc pas l'ouvrir. Mais nous avons vu des PDF être ouverts dans des navigateurs bien avant que les visionneuses de PDF intégrées ne soient une chose, alors comment cela a-t-il fonctionné ?

Il était autrefois possible d'étendre les fonctionnalités du navigateur avec beaucoup plus de contrôle que ce que l'on peut faire aujourd'hui avec des extensions/addons limités. Ces extensions étaient connues sous le nom générique de plugins . Dans Internet Explorer, il s'agissait de contrôles ActiveX ; dans Mozilla Firefox et plus tard Google Chrome, il s'agissait de plugins NPAPI. Ces plugins étaient capables de faire tout ce que n'importe quel autre programme pouvait faire, et pouvaient en outre s'enregistrer en tant que gestionnaire d'un type de fichier spécifique qui pourrait autrement ne pas être reconnu par le navigateur. (Par ailleurs, on a constaté par la suite que cela représentait un énorme risque pour la sécurité et le support de ces puissants plugins a été progressivement abandonné...)

À l'époque des plugins, il suffisait d'installer Adobe Acrobat Reader, qui installait ensuite un plugin ActiveX ou NPAPI pour enregistrer l'interface utilisateur. application/pdf type MIME et indiquer au navigateur d'ouvrir ces types en ligne en utilisant le plugin.

Bien entendu, après un certain nombre de problèmes de sécurité et de performances causés par ces plugins, les principaux fournisseurs de navigateurs ont décidé d'intégrer leurs propres visionneuses de PDF et de supprimer progressivement la prise en charge de la plupart des plugins. Le seul que nous voyons encore est Adobe Shockwave Flash, qui gère application/x-shockwave-flash .

En fait, il reste encore quelques contrôles pour cela, par exemple, dans Firefox, la fonction Preview in Firefox existe toujours :

Screenshot of option

Dans le passé, cela aurait permis de choisir entre plusieurs plugins qui enregistraient ce type. Par exemple, la liste des types enregistrés pour Flash :

Screenshot of registered types

Cette époque était également antérieure à la prise en charge de nombreux médias par le HTML5. Il n'y avait pas que les PDF - votre navigateur n'avait aucune idée de la façon de gérer un conteneur MP4 ou une vidéo H.264, aucune idée de la façon de lire un fichier MP3, etc. On voyait des plugins fournis par des lecteurs multimédias comme VLC ou même Windows Media Player, ou bien les sites Web intégraient un lecteur multimédia construit en Flash.

24voto

Rgrthat Points 1011

J'ai trouvé une explication. D'après un réponse que j'ai trouvée il apparaît que Chrome téléchargera un PDF si le type de contenu MIME n'est pas défini comme suit application/pdf mais plutôt un "type MIME incorrect ou générique", application/octet-stream .

En outre, , "La plupart des serveurs web envoient des ressources de type inconnu en utilisant l'adresse par défaut. application/octet-stream Type MIME. Pour des raisons de sécurité, la plupart des navigateurs ne permettent pas de définir une action par défaut personnalisée pour de telles ressources, ce qui oblige l'utilisateur à les stocker sur le disque pour les utiliser."

23voto

Dj S Points 101

Cela est dû à la HTTP Content-Disposition en-tête en spécifiant que le fichier est un pièce jointe . Cela indique au navigateur de télécharger le fichier, plutôt que de l'ouvrir directement.

Il existe un module complémentaire pour Chrome qui permet de contourner ce comportement. L'image suivante provient des outils de développement de Firefox :

HTTP request as seen in the Firefox development tools

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X