← Όλα τα εργαλεία

Οδηγός Τύπων MIME

Τι είναι οι τύποι MIME, πώς λειτουργεί η μορφή type/subtype, πού έχει σημασία το Content-Type σε HTTP και email, κοινοί τύποι, και γιατί ένας λάθος τύπος χαλάει τα πράγματα.
ΕπέκτασηΤύπος MIME

Τι είναι πραγματικά ένας τύπος MIME

Ένας τύπος MIME, γνωστός και ως τύπος πολυμέσων (media type), είναι μια σύντομη ετικέτα που ενημερώνει το λογισμικό για το είδος δεδομένων που περιέχει ένα αρχείο ή ένα σώμα μηνύματος. Γεννήθηκε στο email (το όνομα σημαίνει Multipurpose Internet Mail Extensions) αλλά σήμερα εμφανίζεται παντού στον ιστό. Η μορφή είναι πάντα type/subtype: μια ευρεία κατηγορία, μια κάθετος, και μια συγκεκριμένη μορφή. Έτσι το text/html σημαίνει «κείμενο, σε μορφή HTML», το image/png σημαίνει «εικόνα, σε μορφή PNG», και το application/json σημαίνει «δεδομένα εφαρμογής, κωδικοποιημένα ως JSON».

Ο τύπος ανωτάτου επιπέδου προέρχεται από ένα σταθερό σύνολο που διατηρείται από την IANA, το επίσημο μητρώο: text, image, audio, video, application, font, model, multipart, και μερικοί νεότεροι όπως το haptics. Ο υπότυπος είναι η συγκεκριμένη μορφή. Οι προμηθευτές μπορούν να προσθέσουν τους δικούς τους με πρόθεμα vnd. (για παράδειγμα application/vnd.ms-excel), και οι πειραματικοί τύποι χρησιμοποιούσαν ιστορικά ένα πρόθεμα x-, αν και αυτή η σύμβαση πλέον αποθαρρύνεται.

Αφηρημένα λαμπερά εικονίδια μορφών αρχείων ταξινομημένα σε επισημασμένα πλακίδια κατηγοριών σε σκούρο λουλακί φόντο
Κάθε μορφή αρχείου αντιστοιχεί σε μια ετικέτα type/subtype.

Πού έχει σημασία ο τύπος MIME

Το πιο σημαντικό σημείο όπου εμφανίζεται ένας τύπος MIME είναι η κεφαλίδα απόκρισης HTTP Content-Type. Όταν ένας διακομιστής στέλνει μια σελίδα, μια εικόνα ή ένα ωφέλιμο φορτίο API, αυτή η κεφαλίδα λέει στο πρόγραμμα περιήγησης πώς να ερμηνεύσει τα byte. Αν η κεφαλίδα λέει text/html, το πρόγραμμα περιήγησης αποδίδει τη μαρκάρισμα· αν λέει application/json, μια κλήση fetch() μπορεί να την αναλύσει· αν λέει application/pdf, ανοίγει ο ενσωματωμένος προβολέας. Η ίδια κεφαλίδα ταξιδεύει και στην πλευρά του αιτήματος: όταν στέλνετε με POST μια φόρμα ή ένα σώμα API, το Content-Type λέει στον διακομιστή πώς να διαβάσει αυτό που στείλατε.

Πέρα από το HTTP, οι τύποι MIME καθοδηγούν αρκετά άλλα συστήματα. Οι πελάτες email τους χρησιμοποιούν για να αποφασίσουν αν ένα συνημμένο είναι εικόνα για προεπισκόπηση ή δυαδικό αρχείο για αποθήκευση. Οι χειριστές μεταφόρτωσης αρχείων εξετάζουν τον δηλωμένο τύπο για να αποδεχτούν ή να απορρίψουν αρχεία. Και το λειτουργικό σύστημα ή το πρόγραμμα περιήγησης χρησιμοποιεί τον τύπο, όχι μόνο την επέκταση αρχείου, για να επιλέξει μια προεπιλεγμένη εφαρμογή. Η ίδια ιδέα διέπει τον τρόπο με τον οποίο οι διακομιστές αναφέρουν αποτελέσματα και σφάλματα μαζί με τους κωδικούς κατάστασης HTTP — μια απόκριση 200 με λάθος τύπο μπορεί να είναι εξίσου προβληματική με μια 404.

Αυτοί που θα χρησιμοποιείτε καθημερινά

Μια χούφτα τύποι καλύπτουν τη συντριπτική πλειονότητα της πραγματικής κίνησης:

  • text/html — ιστοσελίδες (επέκταση .html)
  • text/css — φύλλα στυλ (.css)
  • text/javascript — ο συνιστώμενος τύπος για JavaScript (.js, .mjs)
  • application/json — ο μοναδικός επίσημος τύπος JSON, όπως ορίζεται στο RFC 8259 (.json)
  • image/png, image/jpeg, image/webp, image/svg+xml — κοινές μορφές εικόνας
  • application/pdf — έγγραφα PDF (.pdf)
  • application/octet-stream — ο γενικός τύπος για άγνωστα ή αυθαίρετα δυαδικά δεδομένα
  • text/plain — η προεπιλογή για απλό κείμενο χωρίς πλουσιότερο τύπο

Το JSON αξίζει μια σημείωση επειδή μπερδεύει τον κόσμο. Ο μόνος σωστός τύπος είναι application/json. Παλαιότερος κώδικας χρησιμοποιούσε μερικές φορές text/json, text/plain, ή application/x-javascript, αλλά αυτοί είναι πλέον απαρχαιωμένοι και ορισμένοι πελάτες θα αρνηθούν να τους αναλύσουν. Δεν υπάρχει καν παράμετρος charset για το JSON — η προδιαγραφή επιβάλλει UTF-8, οπότε η γραφή application/json; charset=utf-8 είναι περιττή αν και ακίνδυνη. Για έναν πληρέστερο πίνακα μορφών και επεκτάσεων, δείτε τους πίνακες αναφοράς μας.

Ένα λαμπερό πακέτο δεδομένων με ετικέτα αφηρημένου διακριτικού τύπου να ρέει μέσα από μια σύνδεση δικτύου
Το Content-Type ταξιδεύει μαζί με το ωφέλιμο φορτίο μέσω HTTP.

Γιατί ένα λάθος Content-Type χαλάει τα πράγματα

Τα προγράμματα περιήγησης και οι πελάτες εμπιστεύονται τον δηλωμένο τύπο, οπότε ένα λάθος έχει συγκεκριμένες συνέπειες. Στείλτε μια απόκριση API JSON ως text/html και το πρόγραμμα περιήγησης μπορεί να προσπαθήσει να την αποδώσει, ή ένας αυστηρός πελάτης μπορεί να ρίξει σφάλμα ανάλυσης πριν καν εκτελεστεί ο κώδικάς σας. Στείλτε ένα αρχείο CSS ή JavaScript με λάθος τύπο και ένα χαρακτηριστικό ασφαλείας που ονομάζεται X-Content-Type-Options: nosniff θα κάνει το πρόγραμμα περιήγησης να αρνηθεί να το εφαρμόσει, χαλώντας σιωπηλά τη μορφοποίηση της σελίδας σας ή τα σενάριά σας.

Οι λήψεις είναι η άλλη κλασική αποτυχία. Αν θέλετε ένα αρχείο να κατεβαίνει αντί να εμφανίζεται, ο τύπος έχει σημασία μαζί με την κεφαλίδα Content-Disposition. Ένα PDF που στέλνεται ως application/octet-stream κατεβαίνει ως γενικό αρχείο αντί να ανοίγει στον προβολέα· μια εικόνα που στέλνεται ως text/plain εμφανίζεται ως ακατάληπτοι χαρακτήρες. Στην πλευρά της μεταφόρτωσης, ένα λανθασμένα επισημασμένο αρχείο μπορεί να προσπεράσει έναν αφελή έλεγχο επέκτασης, γι' αυτό οι στιβαρές μηχανές επαλήθευσης εξετάζουν τα πραγματικά byte (τον «μαγικό αριθμό») αντί να εμπιστεύονται τον τύπο που παρέχεται από τον πελάτη.

Ιστορικά, τα προγράμματα περιήγησης προσπαθούσαν να μαντέψουν, ή να «οσμιστούν» (sniff), τον πραγματικό τύπο όταν η κεφαλίδα φαινόταν λάθος. Αυτή η συμπεριφορά προκάλεσε τρύπες ασφαλείας, οπότε η σύγχρονη βέλτιστη πρακτική είναι να στέλνετε πάντα ένα ακριβές Content-Type και να απενεργοποιείτε την οσμή με το nosniff. Με λίγα λόγια: ορίστε τον τύπο σκόπιμα σε κάθε απόκριση, και τα περισσότερα σφάλματα απόδοσης, λήψης και ανάλυσης εξαφανίζονται.

Συχνές ερωτήσεις

Ποια είναι η διαφορά μεταξύ τύπου MIME και τύπου πολυμέσων;

Είναι το ίδιο πράγμα. Ο όρος «τύπος MIME» είναι το παλαιότερο όνομα από το email, ενώ ο «τύπος πολυμέσων» είναι ο όρος που προτιμούν η IANA και οι σύγχρονες προδιαγραφές HTTP. Και οι δύο αναφέρονται στην ετικέτα type/subtype.

Ποιος είναι ο σωστός τύπος MIME για το JSON;

Είναι το application/json, όπως ορίζεται στο RFC 8259. Παλαιότερες εναλλακτικές όπως το text/json ή το application/x-javascript είναι απαρχαιωμένες και ορισμένοι πελάτες θα τις απορρίψουν.

Τι σημαίνει το application/octet-stream;

Είναι ο γενικός τύπος για αυθαίρετα δυαδικά δεδομένα χωρίς πιο συγκεκριμένη ετικέτα. Οι διακομιστές το χρησιμοποιούν ως εναλλακτική λύση για άγνωστους τύπους αρχείων, κάτι που συνήθως ενεργοποιεί μια λήψη αντί για εμφάνιση εντός του προγράμματος περιήγησης.

Γιατί δεν φορτώνει το αρχείο CSS ή JavaScript μου;

Συχνά ο διακομιστής το στέλνει με λάθος Content-Type. Με το X-Content-Type-Options ρυθμισμένο σε nosniff, το πρόγραμμα περιήγησης αρνείται να εφαρμόσει CSS που δεν είναι text/css ή σενάρια που δεν είναι τύπου JavaScript. Διορθώστε τη ρύθμιση του διακομιστή ώστε να στέλνεται ο σωστός τύπος.

Μπορώ να προσθέσω charset σε έναν τύπο MIME;

Ναι, για μορφές κειμένου, χρησιμοποιώντας μια παράμετρο όπως text/html; charset=utf-8. Για το JSON είναι περιττό επειδή η μορφή είναι πάντα UTF-8 βάσει προδιαγραφής, αν και η προσθήκη του δεν προκαλεί βλάβη.

Η επέκταση αρχείου καθορίζει τον τύπο MIME;

Όχι μέσω HTTP. Ο διακομιστής αποφασίζει ποιο Content-Type θα στείλει, και το πρόγραμμα περιήγησης εμπιστεύεται αυτή την κεφαλίδα. Η επέκταση λειτουργεί μόνο ως υπόδειξη για εργαλεία και λειτουργικά συστήματα όταν δεν παρέχεται ρητός τύπος.