FormData
This chapter is about sending HTML forms: with or without files, with additional fields and so on. FormData objects can help with that. As you might have guessed, it’s the object to represent HTML form data. The constructor is: 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: multipart/form-data. 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: In this example, the server code is not presented, as it’s beyond 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 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 one 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:
Sending a form with a file
The form is always sent as Content-Type: multipart/form-data, this encoding allows to send files. So, fields are sent also, similar to a usual form submission. Here’s an example with such form:
Sending a form with Blob data
As we’ve seen in the chapter info:fetch, it’s easy to send dynamically generated binary data e.g. an image, as Blob. We can supply it directly as fetch parameter body. In practice though, it’s often convenient to send an image not separately, but as a part of the form, with additional fields, such as “name” and other metadata. Also, servers are usually more suited to accept multipart-encoded forms, rather than raw binary data. This example submits an image from
Summary
FormData objects are used to capture HTML form and submit it using fetch or another network method. We can either create new FormData(form) from an HTML form, or create an object without a form at all, and then append fields with methods: - formData.append(name, value) - formData.append(name, blob, fileName) - formData.set(name, value) - formData.set(name, blob, fileName) Let’s note two peculiarities here: 1. The set method removes fields with the same name, append doesn’t. That’s the only difference between them. 2. To send a file, 3-argument syntax is needed, the last argument is a file name, that normally is taken from user filesystem for . Other methods are: - formData.delete(name) - formData.get(name) - formData.has(name) That’s it!
let formData = new FormData([form]);
Follow the lesson from Microsoft Web-Dev-For-Beginners course