Corpo Multipart

Inviare i dati come multipart/form-data

Usando l'API FormData

Browser

const form = new FormData();
form.append("my_field", "my value");
form.append("my_buffer", new Blob([1, 2, 3]));
form.append("my_file", fileInput.files[0]);

axios.post("https://example.com", form);

Si può ottenere lo stesso risultato usando il serializzatore interno di Axios e il metodo abbreviato corrispondente:

axios.postForm("https://httpbin.org/post", {
  my_field: "my value",
  my_buffer: new Blob([1, 2, 3]),
  my_file: fileInput.files, // FileList verrà scomposto in campi separati
});

I form HTML possono essere passati direttamente come payload della richiesta

Node.js

import axios from "axios";

const form = new FormData();
form.append("my_field", "my value");
form.append("my_buffer", new Blob(["some content"]));

axios.post("https://example.com", form);

Siccome node.js non supporta al momento la creazione di Blob da un file, puoi comunque farlo utilizzando un pacchetto di terze parti.

import { fileFromPath } from "formdata-node/file-from-path";

form.append("my_field", "my value");
form.append("my_file", await fileFromPath("/foo/bar.jpg"));

axios.post("https://example.com", form);

Per le versioni di Axios precedenti alla versione v1.3.0, devi importare il pacchetto form-data.

const FormData = require("form-data");

const form = new FormData();
form.append("my_field", "my value");
form.append("my_buffer", new Buffer(10));
form.append("my_file", fs.createReadStream("/foo/bar.jpg"));

axios.post("https://example.com", form);

🆕 Serializzazione automatica

A partire dalla versione v0.27.0, Axios supporta la serializzazione automatica degli oggetti in oggetti di tipo FormData se l'header Content-Type della richiesta è impostato su multipart/form-data.

La seguente richiesta invia i dati nel formato FormData (Browser e Node.js):

import axios from "axios";

axios
  .post(
    "https://httpbin.org/post",
    {
      user: {
        name: "Dmitriy",
      },
      file: fs.createReadStream("/foo/bar.jpg"),
    },
    {
      headers: {
        "Content-Type": "multipart/form-data",
      },
    }
  )
  .then(({ data }) => console.log(data));

Il serializzatore FormData di Axios supporta alcune terminazioni speciali per eseguire le seguenti operazioni:

NOTA: L'operazione di scomponimento/espansione verrà usata di default sugli array e sugli oggetti FileList

Il serializzatore di FormData supporta opzioni aggiuntive attraverso la proprietà config.formSerializer: object per gestire casi rari:

Mettiamo caso di avere un oggetto come questo:

const obj = {
  x: 1,
  arr: [1, 2, 3],
  arr2: [1, [2], 3],
  users: [
    { name: "Peter", surname: "Griffin" },
    { name: "Thomas", surname: "Anderson" },
  ],
  "obj2{}": [{ x: 1 }],
};

Il serializzatore interno di Axios eseguirà il passaggio successivo:

const formData = new FormData();
formData.append("x", "1");
formData.append("arr[]", "1");
formData.append("arr[]", "2");
formData.append("arr[]", "3");
formData.append("arr2[0]", "1");
formData.append("arr2[1][0]", "2");
formData.append("arr2[2]", "3");
formData.append("users[0][name]", "Peter");
formData.append("users[0][surname]", "Griffin");
formData.append("users[1][name]", "Thomas");
formData.append("users[1][surname]", "Anderson");
formData.append("obj2{}", '[{"x":1}]');
import axios from "axios";

axios
  .post(
    "https://httpbin.org/post",
    {
      "myObj{}": { x: 1, s: "foo" },
      "files[]": document.querySelector("#fileInput").files,
    },
    {
      headers: {
        "Content-Type": "multipart/form-data",
      },
    }
  )
  .then(({ data }) => console.log(data));

Axios supporta anche i seguenti metodi rapidi: postForm, putForm, patchForm che non sono altro che i corrispondenti metodi http con l'header content-type impostato già a multipart/form-data.

L'oggetto FileList può essere passato direttamente:

await axios.postForm(
  "https://httpbin.org/post",
  document.querySelector("#fileInput").files
);

Tutti i file verranno inviati con gli stessi campi: files[];