J'essaie d'envoyer un fichier et un json dans la même demande multipart POST à mon point de terminaison REST. La demande est faite directement à partir de javascript en utilisant la bibliothèque axios comme indiqué dans la méthode ci-dessous.
doAjaxPost() {
var formData = new FormData();
var file = document.querySelector('#file');
formData.append("file", file.files[0]);
formData.append("document", documentJson);
axios({
method: 'post',
url: 'http://192.168.1.69:8080/api/files',
data: formData,
})
.then(function (response) {
console.log(response);
})
.catch(function (response) {
console.log(response);
});
}
Cependant, le problème est que lorsque je vérifie la demande dans les outils de développement chrome de l'onglet Réseau, je ne trouve aucun champ Content-Type
Pour document
, tandis que pour le champ file
Content-Type
Est application/pdf
(J'envoie un fichier pdf).
Sur le serveur Content-Type
Pour document
est text/plain;charset=us-ascii
.
Mise à jour:
J'ai réussi à faire une demande correcte via Postman, en envoyant document
sous forme de fichier .json
. Bien que j'ai découvert que cela ne fonctionne que sur Linux/Mac.
Pour définir un type de contenu, vous devez transmettre un objet de type fichier. Vous pouvez en créer un en utilisant un Blob
.
const obj = {
hello: "world"
};
const json = JSON.stringify(obj);
const blob = new Blob([json], {
type: 'application/json'
});
const data = new FormData();
data.append("document", blob);
axios({
method: 'post',
url: '/sample',
data: data,
})
il vous suffit d'ajouter les bons en-têtes à votre demande
axios({
method: 'post',
url: 'http://192.168.1.69:8080/api/files',
data: formData,
header: {
'Accept': 'application/json',
'Content-Type': 'multipart/form-data',
},
})