在 Axios、Nodejs 中发布带有文件的多部分表单

Joe*_*Joe 0 http node.js axios

const form_data = new FormData();
form_data.append("File", fs.createReadStream(pathToFile));
form_data.append('Login', alias.toUpperCase());

const request_config = {
    headers: {
        "Authorization": "Basic 123",
        "Content-Type": 'multipart/form-data'
    },
    data: form_data
};

await axios.post(url, params, request_config).then(response => {
Run Code Online (Sandbox Code Playgroud)

发布到我无法调试的端点。答案是 500。

这是错误:

在此处输入图片说明

这是正确的方法吗?

我能以某种方式确切地看到 Axios 发送的内容吗?

这是我从 API 的作者那里收到的邮递员请求。这通过:

POST /api/upload HTTP/1.1

Host: api.test.contoso.se

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

Authorization: Basic 123

User-Agent: PostmanRuntime/7.13.0

Accept: */*

Cache-Control: no-cache

Postman-Token: 089af753-fa12-46c4-326f-dfc39c36faab,c5977145-ece3-4b53-93ff-057788eb0dcf

Host: api.test.contoso.se

accept-encoding: gzip, deflate

content-length: 18354

Connection: keep-alive

cache-control: no-cache

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

SV
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Content-Disposition: form-data; name="File"; filename="/C:/Users/file.docx


------WebKitFormBoundary7MA4YWxkTrZu0gW--

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

ABC
Run Code Online (Sandbox Code Playgroud)

sha*_*ncs 5

屏幕截图中的错误消息很清楚:“缺少内容类型边界”。

使用 axios 进行multipart/form-data请求,需要设置边界上传文件。示例代码是:

const form_data = new FormData();

...

const request_config = {
    headers: {
        "Authorization": "Basic 123",
        "Content-Type": 'multipart/form-data; boundary=' + form._boundary
    },
    data: form_data
};

await axios.post(...)
Run Code Online (Sandbox Code Playgroud)

“我能以某种方式确切地看到 Axios 发送的内容吗?”

可以使用Charles等HTTP代理软件来拦截请求,查看发送了什么数据。

  • 给读者的信息:对于 NodeJS,如果您使用 require("form-data"),它不是 `form._boundary` 而是 `form_data.getBoundary()` (2认同)
  • 更直观的方法是设置由 FormData 对象通过“data: form_data.getHeaders()”自动创建的标题。这将设置内容类型标头的值,无需手动设置。参考 - https://github.com/form-data/form-data#axios (2认同)