express (using multer) Error: Multipart: Boundary not found, request sent by POSTMAN

express (using multer) Error: Multipart: Boundary not found, request sent by POSTMAN

注意:仅当我在 Postman 中使用表单数据正文表单时(这是我必须使用的表单,因为我想在文本字段旁边发送文件),我得到:

Error: Multipart: Boundary not found

当我使用 x-www-form-urlencoded 时一切正常。 (当然当 body-parser 被用作中间件时

这是请求内容:(邮递员制作)

POST /test HTTP/1.1
Host: localhost:3000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Cache-Control: no-cache
Postman-Token: 61089a44-0b87-0530-ca03-a24374786bd1

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="test"

a simple word
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="data"

good
------WebKitFormBoundary7MA4YWxkTrZu0gW--

index.js:

var express = require('express');
var app = express();

var multer = require('multer');
var upload = multer();

app.post('/test', upload.array(), function (req, res, next) {
    console.log(req.body.test);
    console.log(req.body);
});

app.listen(3000, function () {
    console.log('app started');
});

我找到了解决方案。我只需要 阻止邮递员发送 Content-Type header。所以我只是从请求 headers.

中删除了它

对于 JMeterpostmanheader 中删除 Content-Type

它将解决您的问题。

我将对 user9150719 进行一些扩展,以帮助那些在前端方面遇到相同问题并且想知道在哪里删除 header 的人。

我遇到了同样的问题;我试图从 Angular 应用程序 post 到我的 Nodejs 服务器。我的 post 请求包括原始数据和文件输入。所以我在想 FormData()

Angular 服务

//Declare header variables. 

formDataHeader = {
        headers: new HttpHeaders({
          Accept: 'application/json',
          'Access-Control-Allow-Origin': '*',
          'Content-Type': 'multipart/form-data',
          Authorization: 'Bearer ' + this._myService.getToken()
        })
      };

//Post function to Nodejs server
    addNewContact(contact: FormData): any {

        return this._httpClient.post(
          environment.apiBaseUrl + '/contacts', // POST /api/contacts
          (contact), // contact data,
          this.formDataHeader
        );
    }

我的 formData 设置正确。我能够获取所有数据,但问题是我在我的请求中设置了几个 headers 导致了 user9150719 遇到的情况。

我的解决方案是将我的 header 简化为:

formDataHeader = {
        headers: new HttpHeaders({
          Authorization: 'Bearer ' + this._myService.getToken()
        })
      };

另一件需要指出的重要事情是,我不需要在我的 <form></form> 标签上设置 enctype="multipart/form-data"

即使我有一个 httpInterceptor 设置(我认为它不能正常工作),我仍然需要在我的所有请求中添加 Authorization header,但是所有其他 headers 导致我 api 调用 return 意外结果。

最后我认为(但我不完全确定)我不需要设置额外 headers 的原因是因为在我的 NodeJS 服务器中,我已经配置了 header 期待。

Node.JS 服务器

// app.js

app.use('/public/uploads', express.static('uploads'));
app.use('/public', express.static('public'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(cors());
app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'x-www-form-urlencoded, Origin, X-Requested-With, Content-Type, Accept, Authorization, *');
    if (req.method === 'OPTIONS'){
        res.header('Access-Control-Allow-Methods', 'GET, PUT, POST, PATCH, DELETE, OPTIONS');
        res.setHeader('Access-Control-Allow-Credentials', true);
        return res.status(200).json({});
    }
    next();
});
app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));
app.use(bodyParser.json({limit: '50mb', extended: true}));

所以我认为,如果您的服务器设置为处理某些类型的 header(Content-Type、授权、来源等),您不一定需要设置那些 headers 当您将请求发送到服务器时再次出现在您的前端。有一些例外,例如 Authorization 在某些情况下需要设置;可能是因为它们以 token 或其他形式携带一些数据。

我希望这对外面的人有帮助!

为了了解发生这种情况的原因,

在任何 HTTP 请求中使用内容类型 multipart/form-data 时,您可以在 Content-Type 规范旁边添加边界信息,例如:

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

您可以将 MyBoundary 替换为您喜欢的任何字符串。

然后您必须将表单数据 (name=Abebe&age=5) 编码为:

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

Abebe
--MyBoundary
Content-Disposition: form-data; name="age"

5
--MyBoundary--

有关详细信息,请阅读 this Whosebug question and answer