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.
中删除了它
对于 JMeter 和 postman 从 header 中删除 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
注意:仅当我在 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.
对于 JMeter 和 postman 从 header 中删除 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