使用axios在POST multipart / form-data请求中发送文件和json

时间:2018-06-09 12:14:09

标签: javascript json file axios multipartform-data

我正在尝试将同一个多部分POST请求中的文件和一些json发送到我的REST端点。该请求直接来自使用axios库的javascript,如下面的方法所示。

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);
    });
}

但问题是,当我在网络标签中检查Chrome开发人员工具中的请求时,我找不到Content-Type的{​​{1}}字段,而document字段{{1}是file(我正在发送pdf文件)。

Request shown in network inspector

Content-Type的服务器application/pdfContent-Type

更新

我设法通过发送document作为text/plain;charset=us-ascii文件,通过Postman提出正确的请求。虽然我发现这只适用于Linux / Mac。

3 个答案:

答案 0 :(得分:18)

要设置内容类型,您需要传递类似文件的对象。您可以使用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,
})

答案 1 :(得分:-1)

尝试一下。

doAjaxPost() {
    var formData = new FormData();
    var file = document.querySelector('#file');

    formData.append("file", file.files[0]);
    // formData.append("document", documentJson); instead of this, use the line below.
    formData.append("document", JSON.stringify(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);
    });
}

您可以在后端解码此字符串化的JSON。

答案 2 :(得分:-2)

您只需要在请求中添加正确的标题

axios({
  method: 'post',
  url: 'http://192.168.1.69:8080/api/files',
  data: formData,
  header: {
            'Accept': 'application/json',
            'Content-Type': 'multipart/form-data',
          },
    })