web-dev-qa-db-fra.com

Comment changez-vous le type MIME d'un fichier depuis le terminal?

Ce que je recherche, c'est une contrepartie à file -I (Darwin; -i sous Linux).

Par exemple, étant donné:

$ file -I filename.pdf
filename.pdf: application/octet-stream; charset=binary

Je voudrais pouvoir faire quelque chose comme ça:

$ [someCommand] filename.pdf application/pdf

Le résultat serait que le nom de fichier.pdf serait alors tapé comme application/pdf.

La raison de la question est que parfois les serveurs Web utilisent le mauvais type MIME, ce qui fait que les programmes refusent d'ouvrir le fichier. (Le plus souvent texte/simple, selon mon expérience.)

Je recherche man, le Web et ce site depuis environ deux heures et demie. J'ai tout essayé, des vidages hexadécimaux à xattr aux éditeurs de texte.

Votre aide serait très appréciée.

Chris

17
curieux

La chose à propos des types MIME est qu'ils sont presque entièrement fictifs.

MIME et HTTP nous demandent de prétendre que tous nos fichiers ont un morceau de métadonnées identifiant le "type de contenu". Lorsque nous envoyons des fichiers sur le réseau, les métadonnées "type de contenu" les accompagnent, de sorte que personne n'interprète mal le contenu d'un fichier.

La vérité est que ces métadonnées n'existent pas. Au moment où MIME a été inventé, il était vraiment trop tard pour convaincre les fournisseurs de systèmes d'exploitation d'adopter un nouveau système de type pour les fichiers. Unix s'était contenté de nombres magiques, DOS s'était contenté de suffixes de nom de fichier à 3 lettres et MacOS classique avait ses codes de créateur et ses codes de type. (Les codes de type MacOS étaient les plus proches du modèle MIME, car ils étaient en fait séparés à la fois du nom de fichier et du contenu. Mais avec seulement 4 lettres, les types MIME ne convenaient pas.)

Personne ne stocke les types de contenu compatibles MIME dans leur système de fichiers. Lorsqu'un message MIME composer ou serveur HTTP veut envoyer un fichier, il décide du type de fichier de la manière traditionnelle (suffixe du nom de fichier et/ou numéro magique) et mappe le résultat à un type MIME.

Contrairement à la théorie (où MIME élimine la supposition de type de fichier), MIME tel qu'il est implémenté dans la pratique a déplacé la logique du "type de fichier de supposition basé sur le suffixe du nom de fichier et/ou le nombre magique" du récepteur du fichier à l'expéditeur. Comme vous l'avez remarqué, l'expéditeur ne fait généralement pas un meilleur travail que le destinataire l'aurait fait s'il avait été obligé de le découvrir par lui-même. Souvent, dans le cas d'un serveur Web, l'empressement du serveur à gifler un Content-type Sur un fichier aggrave les choses. Il n'y a aucune raison pour qu'un serveur Web sache quoi que ce soit sur le format des fichiers qu'il sert lorsqu'il n'est utilisé que pour les distribuer et n'a pas besoin d'interpréter leur contenu.

La commande file devine le type de fichier en lisant le contenu et en recherchant des nombres et des chaînes magiques. L'option -I Ne change rien à cela. Il choisit simplement un format de sortie différent.

Pour modifier l'en-tête Content-Type Qu'un serveur Web envoie pour un fichier spécifique, vous devez consulter le manuel de configuration de votre serveur Web. Vous ne pouvez rien faire pour le fichier lui-même.

14
user2404501

Si vous avez un pdf et que le $file --mime-type réponse à la commande octet-stream et pas application/pdf, vous avez une corruption dans votre fichier.

Les lecteurs pdf le liront et ignoreront le problème, mais si vous téléchargez ce fichier dans une application Web, l'application reconnaîtra le type mime comme un octet-sream. Parfois, c'est un problème, principalement si vous validez le type MIME (j'ai parfois ce problème dans mon application).

Pour obtenir une solution rapide, utilisez un script fantôme comme celui-ci:

gs -o new.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress old.pdf
3
Jeff Almeida

C'est un peu une erreur de catégorie de parler du "type MIME d'un fichier" - les "fichiers" n'ont pas de types MIME; seuls les flux d'octets en ont (je ne suis pas nécessairement en désaccord avec la description de @ wumpus-q-wumbley des types MIME comme "fictifs", mais c'est une autre façon de voir les choses).

MIME signifie Multipurpose Internet Mail Extensions , comme décrit à l'origine dans RFC 2045 , et les types MIME étaient à l'origine destinés à décrire ce un récepteur est censé faire avec le tas d'octets qui suivra bientôt le fil, dans le reste du message électronique. Ils ont été très naturellement réutilisés dans (par exemple) le protocole HTTP, pour permettre à un client de comprendre comment interpréter les octets dans la réponse HTTP dont ce type MIME forme l'en-tête.

Le fait que la commande file puisse afficher un type MIME suggère l'extension supplémentaire de l'idée, pour agir comme la clé qui permet à un système de fenêtrage de rechercher le nom d'une application qui devrait être utilisée pour ouvrir le fichier.

Ainsi, si "le type MIME d'un fichier" signifie quelque chose, cela signifie "le type MIME qu'un serveur Web préfixerait à ce fichier s'il devait être remis en réponse à une requête HTTP" (ou quelque chose comme ça). Pensé comme ça, il est clair que le type MIME fait partie de la configuration du serveur Web, et pas quelque chose d'intrinsèque dans le fichier - un seul fichier peut être livré avec différents types MIME en fonction de l'URL qui le récupère et des détails de la demande et la configuration. Ainsi, un fichier XHTML peut être fourni sous la forme text/html Ou application/xml Ou application/octet-stream Selon les détails de la requête HTTP, le répertoire dans lequel se trouve le fichier ou bien la phase de la lune (cette dernière serait une configuration de serveur inutile ).

Un serveur Web peut avoir un certain nombre de mécanismes pour décider de ce type MIME, qui peuvent inclure une table de recherche basée sur n'importe quelle extension de fichier, un fichier .htaccess, Ou bien la sortie de la commande file .

La réponse à votre question est donc: cela dépend .

  • Si ce que vous voulez faire est de changer la façon dont un serveur Web livre ce fichier, vous devez regarder soit votre documentation du serveur Web , soit le contenu du fichier /etc/mime.types De votre système (si votre système l'utilise et si le serveur est configuré pour s'y replier).
  • Si ce que vous voulez faire est de changer l'application qui ouvre un (type de) fichier donné, votre documentation OS/gestionnaire de fenêtres devrait vous aider.
  • Si vous devez modifier la sortie de la commande file spécifiquement, pour une autre raison, alors man file Est votre ami, et vous devrez probablement fouiller dans le fichier de nombres magiques, raisonnablement soigneusement.
3
Norman Gray