# FormData This chapter is about sending HTML forms: with or without files, with additional fields and so on. [FormData](https://xhr.spec.whatwg.org/#interface-formdata) objects can help with that. As you might have guessed, it's the object to represent HTML form data. The constructor is: ```js let formData = new FormData([form]); ``` If HTML `form` element is provided, it automatically captures its fields. The special thing about `FormData` is that network methods, such as `fetch`, can accept a `FormData` object as a body. It's encoded and sent out with `Content-Type: form/multipart`. From the server point of view, that looks like a usual form submission. ## Sending a simple form Let's send a simple form first. As you can see, that's almost one-liner: ```html run autorun
``` In this example, the server code is not presented, as it's beyound our scope. The server accepts the POST request and replies "User saved". ## FormData Methods We can modify fields in `FormData` with methods: - `formData.append(name, value)` - add a form field with the given `name` and `value`, - `formData.append(name, blob, fileName)` - add a field as if it were ``, the third argument `fileName` sets file name (not form field name), as it it were a name of the file in user's filesystem, - `formData.delete(name)` - remove the field with the given `name`, - `formData.get(name)` - get the value of the field with the given `name`, - `formData.has(name)` - if there exists a field with the given `name`, returns `true`, otherwise `false` A form is technically allowed to have many fields with the same `name`, so multiple calls to `append` add more same-named fields. There's also method `set`, with the same syntax as `append`. The difference is that `.set` removes all fields with the given `name`, and then appends a new field. So it makes sure there's only field with such `name`, the rest is just like `append`: - `formData.set(name, value)`, - `formData.set(name, blob, fileName)`. Also we can iterate over formData fields using `for..of` loop: ```js run let formData = new FormData(); formData.append('key1', 'value1'); formData.append('key2', 'value2'); // List key/value pairs for(let [name, value] of formData) { alert(`${name} = ${value}`); // key1=value1, then key2=value2 } ``` ## Sending a form with a file The form is always sent as `Content-Type: form/multipart`, this encoding allows to send files. So, `` fields are sent also, similar to a usual form submission. Here's an example with such form: ```html run autorun ``` ## Sending a form with Blob data As we've seen in the chapter