Ai-je besoin de Content-Type: application / octet-stream pour le téléchargement de fichiers?

La norme HTTP dit:

Si cet en-tête [Content-Disposition: attachment] est utilisé dans une réponse avec le type de contenu application / octet-stream, la suggestion implicite est que l’agent utilisateur ne doit pas afficher la réponse, mais directement . ‘dialog

Je lis ça comme

Content-Type: application/octet-stream Content-Disposition: attachment 

Mais j’aurais pensé que Content-Type serait application/pdf , image/png , etc.

Dois-je avoir Content-Type: application/octet-stream si je veux que les navigateurs téléchargent le fichier?

Non.

Le type de contenu devrait être ce qu’il est connu, si vous le connaissez. application/octet-stream est défini comme “des données binarys arbitraires” dans la RFC 2046, et il y a un chevauchement certain de ce qui est approprié pour les entités dont l’unique but est d’être enregistré sur le disque, et à partir de là webby “. Ou le regarder dans une autre direction; La seule chose que l’on puisse faire en toute sécurité avec application / octet-stream est de la sauvegarder dans un fichier et espérer que quelqu’un d’autre sache à quoi elle sert.

Vous pouvez combiner l’utilisation de Content-Disposition avec d’autres types de contenu, tels que image/png ou même text/html pour indiquer que vous souhaitez enregistrer plutôt que afficher. Auparavant, certains navigateurs l’ignoraient dans le cas de text/html mais je pense que c’était il y a longtemps à ce stade (et je vais me coucher bientôt, donc je ne vais pas commencer à tester un tout un tas de navigateurs en ce moment, peut-être plus tard).

La RFC 2616 mentionne également la possibilité de jetons d’extension, et ces jours-ci la plupart des navigateurs reconnaissent que vous voulez que l’entité soit affichée si possible (c’est-à-dire si le navigateur sait comment l’afficher, sinon il n’a pas le choix) ). Il s’agit bien sûr du comportement par défaut, mais cela signifie que vous pouvez inclure la partie filename de l’en-tête que les navigateurs utiliseront (peut-être avec des ajustements pour que les extensions de fichiers correspondent au type de contenu en question, peut-être pas ) comme suggestion si l’utilisateur essaie de sauvegarder.

Par conséquent:

 Content-Type: application/octet-stream Content-Disposition: attachment; filename="picture.png" 

Signifie “Je ne sais pas ce que c’est. S’il vous plaît, enregistrez-le sous un fichier, de préférence nommé picture.png”.

 Content-Type: image/png Content-Disposition: attachment; filename="picture.png" 

Signifie “Ceci est une image PNG. Veuillez la sauvegarder sous forme de fichier, de préférence nommé picture.png”.

 Content-Type: image/png Content-Disposition: inline; filename="picture.png" 

Signifie “Ceci est une image PNG. Veuillez l’afficher sauf si vous ne savez pas comment afficher les images PNG. Sinon, ou si l’utilisateur choisit de l’enregistrer, nous vous recommandons le nom picture.png pour le fichier sous lequel vous l’avez sauvegardé”.

Parmi les navigateurs qui reconnaissent en inline certains les utiliseraient toujours, alors que d’autres l’utiliseraient si l’utilisateur avait sélectionné “Enregistrer le lien sous” mais pas s’ils avaient sélectionné “Enregistrer” lors de la visualisation (ou du moins, IE était comme ça, cela a peut-être changé il y a quelques années).