Τι σημαίνει το enctype='multipart/form-data'
σε μια φόρμα HTML και πότε πρέπει να το χρησιμοποιούμε;
Όταν κάνετε μια αίτηση POST, πρέπει να κωδικοποιήσετε με κάποιο τρόπο τα δεδομένα που αποτελούν το σώμα της αίτησης.
Οι φόρμες HTML παρέχουν τρεις μεθόδους κωδικοποίησης.
application/x-www-form-urlencoded
(η προεπιλογή)multipart/form-data
text/plain
Γινόταν δουλειά για την προσθήκη του application/json
, αλλά αυτό έχει εγκαταλειφθεί.
(Άλλες κωδικοποιήσεις είναι δυνατές με αιτήσεις HTTP που παράγονται με άλλα μέσα εκτός από την υποβολή φόρμας HTML).
Οι ιδιαιτερότητες των μορφών δεν έχουν σημασία για τους περισσότερους προγραμματιστές. Τα σημαντικά σημεία είναι τα εξής:
text/plain
.Όταν γράφετε κώδικα από την πλευρά του πελάτη:
multipart/form-data
όταν η φόρμα σας περιλαμβάνει στοιχεία <input type="file">
.multipart/form-data
ή application/x-www-form-urlencoded
αλλά το application/x-www-form-urlencoded
θα είναι πιο αποτελεσματικόΌταν γράφετε κώδικα από την πλευρά του διακομιστή:
Οι περισσότερες (όπως η CGI->param
της Perl's ή αυτή που εκτίθεται από την υπερεπιπέδου $_POST
της PHP's) θα αναλάβουν τις διαφορές για εσάς. Μην μπείτε στον κόπο να προσπαθήσετε να αναλύσετε την ακατέργαστη είσοδο που λαμβάνει ο διακομιστής.
Μερικές φορές θα βρείτε μια βιβλιοθήκη που δεν μπορεί να χειριστεί και τις δύο μορφές. Η πιο δημοφιλής βιβλιοθήκη του Node.js'για το χειρισμό δεδομένων φόρμας είναι η body-parser η οποία δεν μπορεί να χειριστεί πολυμερή αιτήματα (αλλά έχει τεκμηρίωση που συνιστά κάποιες εναλλακτικές λύσεις που μπορούν).
Αν γράφετε (ή κάνετε αποσφαλμάτωση) μια βιβλιοθήκη για την ανάλυση ή την παραγωγή των ακατέργαστων δεδομένων, τότε πρέπει να αρχίσετε να ανησυχείτε για τη μορφή. Μπορεί επίσης να θέλετε να το γνωρίζετε για λόγους ενδιαφέροντος.
Το application/x-www-form-urlencoded
είναι λίγο πολύ το ίδιο με μια συμβολοσειρά ερωτήματος στο τέλος της διεύθυνσης URL.
Το multipart/form-data
είναι σημαντικά πιο περίπλοκο, αλλά επιτρέπει την ενσωμάτωση ολόκληρων αρχείων στα δεδομένα. Ένα παράδειγμα του αποτελέσματος μπορεί να βρεθεί στην προδιαγραφή HTML 4.
Το text/plain
εισάγεται από την HTML 5 και είναι χρήσιμο μόνο για αποσφαλμάτωση - από την προδιαγραφή: Δεν είναι αξιόπιστα ερμηνεύσιμα από υπολογιστή - και θα έλεγα ότι τα άλλα σε συνδυασμό με εργαλεία (όπως η καρτέλα Net στα εργαλεία ανάπτυξης των περισσότερων προγραμμάτων περιήγησης) είναι καλύτερα για αυτό).
enctype='multipart/form-data
είναι ένας τύπος κωδικοποίησης που επιτρέπει την αποστολή αρχείων μέσω ενός POST. Πολύ απλά, χωρίς αυτή την κωδικοποίηση τα αρχεία δεν μπορούν να σταλούν μέσω POST.
Εάν θέλετε να επιτρέψετε σε έναν χρήστη να ανεβάσει ένα αρχείο μέσω μιας φόρμας, πρέπει να χρησιμοποιήσετε αυτόν τον enctype.
Κατά την υποβολή μιας φόρμας, λέτε στο πρόγραμμα περιήγησής σας να στείλει, μέσω του πρωτοκόλλου HTTP, ένα μήνυμα στο δίκτυο, κατάλληλα περιτυλιγμένο σε μια δομή μηνυμάτων του πρωτοκόλλου TCP/IP. Μια σελίδα HTML έχει έναν τρόπο να στέλνει δεδομένα στο διακομιστή: χρησιμοποιώντας τα <form>
s.
Όταν υποβάλλεται μια φόρμα, δημιουργείται ένα αίτημα HTTP και αποστέλλεται στον διακομιστή, το μήνυμα θα περιέχει τα ονόματα των πεδίων της φόρμας και τις τιμές που συμπλήρωσε ο χρήστης. Αυτή η μετάδοση μπορεί να συμβεί με τις μεθόδους POST
ή GET
HTTP.
POST
λέει στο πρόγραμμα περιήγησής σας να δημιουργήσει ένα μήνυμα HTTP και να τοποθετήσει όλο το περιεχόμενο στο σώμα του μηνύματος (ένας πολύ χρήσιμος τρόπος για να γίνουν τα πράγματα, πιο ασφαλής και επίσης ευέλικτος).GET
θα υποβάλει τα δεδομένα της φόρμας στο querystring. Έχει κάποιους περιορισμούς σχετικά με την αναπαράσταση και το μήκος των δεδομένων.Το χαρακτηριστικό enctype
έχει νόημα μόνο όταν χρησιμοποιείται η μέθοδος POST
. Όταν ορίζεται, δίνει εντολή στο πρόγραμμα περιήγησης να στείλει τη φόρμα κωδικοποιώντας το περιεχόμενό της με συγκεκριμένο τρόπο. Από MDN - Form enctype:
Όταν η τιμή του χαρακτηριστικού method είναι post, το enctype είναι το MIME τύπος περιεχομένου που χρησιμοποιείται για την αποστολή της φόρμας στον διακομιστή.
application/x-www-form-urlencoded
: Αυτή είναι η προεπιλεγμένη ρύθμιση. Κατά την αποστολή της φόρμας, όλα τα ονόματα και οι τιμές συλλέγονται και η Κωδικοποίηση URL εκτελείται στην τελική συμβολοσειρά.multipart/form-data
: Οι χαρακτήρες ΔΕΝ κωδικοποιούνται. Αυτό είναι σημαντικό όταν η φόρμα έχει ένα στοιχείο ελέγχου μεταφόρτωσης αρχείων. Θέλετε να στείλετε το αρχείο δυαδικά και αυτό διασφαλίζει ότι η ροή bit δεν αλλοιώνεται.text/plain
: Τα κενά μετατρέπονται, αλλά δεν πραγματοποιείται καμία άλλη κωδικοποίηση.Κατά την υποβολή φορμών, μπορεί να προκύψουν ορισμένες ανησυχίες σχετικά με την ασφάλεια, όπως αναφέρεται στο RFC 7578 Section 7: Multipart form data - Security considerations:
Όλα τα λογισμικά επεξεργασίας φορμών θα πρέπει να αντιμετωπίζουν τα δεδομένα που παρέχονται από τον χρήστη. με ευαισθησία, καθώς συχνά περιέχουν εμπιστευτικές ή προσωπικές ταυτοποιητικές πληροφορίες. Υπάρχει ευρέως διαδεδομένη χρήση της "αυτόματης συμπλήρωσης" της φόρμας, χαρακτηριστικά σε προγράμματα περιήγησης στο διαδίκτυο- αυτά μπορεί να χρησιμοποιηθούν για να εξαπατήσουν τους χρήστες να εν αγνοία τους να στέλνουν εμπιστευτικές πληροφορίες όταν συμπληρώνουν διαφορετικά Η multipart/form-data δεν παρέχει κανένα χαρακτηριστικό για τον έλεγχο της ακεραιότητας, τη διασφάλιση της εμπιστευτικότητας, την αποφυγή χρηστών σύγχυσης, ή άλλα χαρακτηριστικά ασφαλείας- αυτές οι ανησυχίες πρέπει να πρέπει να αντιμετωπίζονται από τις εφαρμογές συμπλήρωσης και ερμηνείας των δεδομένων της φόρμας. >, Οι εφαρμογές που λαμβάνουν φόρμες και τις επεξεργάζονται πρέπει να είναι προσεκτικές να μην παρέχουν δεδομένα πίσω στον αιτούντα ιστότοπο επεξεργασίας εντύπων που δεν προοριζόταν να αποσταλούν. >, Είναι σημαντικό κατά την ερμηνεία του ονόματος αρχείου του Content- Disposition πεδίου κεφαλίδας να μην αντικαταστήσουμε κατά λάθος αρχεία στο χώρο αρχείων του παραλήπτη.
Αυτό σας αφορά εάν είστε προγραμματιστής και ο διακομιστής σας θα επεξεργάζεται φόρμες που υποβάλλονται από χρήστες και οι οποίες ενδέχεται να καταλήξουν να περιέχουν ευαίσθητες πληροφορίες.