multipart/formdata: what & why

Why is it recommended to use multipart/formdata to upload file


3 min read

Multipart/formdata is a way of transferring form data from a client to a server.

It was first described in 1995 with the RFC 1867 witch makes it one of the oldest specification about transferring huge data between computer. Let's see why is it the recommended approach to transfer some data in a client/server architecture.


Here are some reasons why it is the recommended approach to implement file upload:

  • Possibility to transfer different kind of data inside the same request

  • Efficiency compared to bare text sending

  • Supported on all internet browsers

Let’s dive into each reason:

Possibility to transfer different kind of data inside the same request

The mulltipart/formdata specification allow sending of multiple types of content along the same request. It means that you can transfer simple text, JSON data, binary data in the payload of the request. Each part need to be separated by a boundary, identified by a name and a content-type.

In the following example, you can see that we are sending :

  • form-data

  • text/plain

  • and image/gif

Content-Type: multipart/form-data; boundary=AaB03x

   Content-Disposition: form-data; name="submit-name"

   Content-Disposition: form-data; name="files"
   Content-Type: multipart/mixed; boundary=BbC04y

   Content-Disposition: file; filename="file1.txt"
   Content-Type: text/plain

   ... contents of file1.txt ...
   Content-Disposition: file; filename="file2.gif"
   Content-Type: image/gif
   Content-Transfer-Encoding: binary

   ...contents of file2.gif...

Efficiency compared to bare text sending

The content type "application/x-www-form-urlencoded" is inefficient for sending large quantities of binary data or text containing non-ASCII characters. The content type "multipart/form-data" should be used for submitting forms that contain files, non-ASCII data, and binary data.

  • application/x-www-form-urlencoded and application/json are designed to handle text data and not binary data. If you want to send binary data, you need to encode it in base64, which is inefficient regarding the output result size.

  • Browser handle content negotiation: The approach of sending file using JSON is not standard, and you may need to implement it yourself both on your client and the server before benefiting from it. Knowing that your browser and the server negotiate to handle the content transfer, your implementation.

Transferring a content to the browser by default use

Supported on all internet browsers

multipart/formdata has been around for decades. It has been the norm for transferring file to a backend, and all the internet relies on it.

multipart/formdata is the way of transferring file, and form-data from a client to a server in an efficient way. They are some alternative, but they would be an overhead for implementation and may not be as benefiting for your development.

In the next post, we will dig deeper into how multipart/formdata is structured to send different kind of data to your server.