What does enctype='multipart/form-data' mean?
html, http-headers, multipartform-data
Solution
When you make a POST request, you have to encode the data that forms the body of the request in some way.
HTML forms provide three methods of encoding.
- `application/x-www-form-urlencoded` (the default)
- `multipart/form-data`
- `text/plain`
Work was being done on adding `application/json`, but that has been abandoned.
(Other encodings are possible with HTTP requests generated using other means than an HTML form submission. JSON is a common format for use with web services and some still use SOAP.)
The specifics of the formats don't matter to most developers. The important points are:
- Never use `text/plain`.
When you are writing client-side code:
- use `multipart/form-data` when your form includes any `<input type="file">` elements
- otherwise you can use `multipart/form-data` or `application/x-www-form-urlencoded` but `application/x-www-form-urlencoded` will be more efficient
When you are writing server-side code:
- Use a prewritten form handling library
Most (such as Perl's `CGI->param` or the one exposed by PHP's `$_POST` superglobal) will take care of the differences for you. Don't bother trying to parse the raw input received by the server.
Sometimes you will find a library that can't handle both formats. Node.js's most popular library for handling form data is body-parser which cannot handle multipart requests (but has documentation that recommends some alternatives which can).
If you are writing (or debugging) a library for parsing or generating the raw data, then you need to start worrying about the format. You might also want to know about it for interest's sake.
`application/x-www-form-urlencoded` is more or less the same as a query string on the end of the URL.
`multipart/form-data` is significantly more complicated but it allows entire files to be included in the data. An example of the result can be found in the HTML 4 specification.
`text/plain` is introduced by HTML 5 and is useful only for debugging — from the spec: They are not reliably interpretable by computer — and I'd argue that the others combined with tools (like the Network Panel in the developer tools of most browsers) are better for that).
Problem
What does `enctype='multipart/form-data'` mean in an HTML form and when should we use it?