最近在使用Nodejs写POST接口的时候,涉及到客户端在请求体中上传base64编码图片的问题,例如我使用的POST请求,问题描述如下:
插入车流量记录 接口描述:根据指定条件插入站点记录数据 服务地址:http://127.0.0.1:12082/api/insertCarFlowRecord 请求方式:POST请求 数据格式:JSON 参数格式:
参数名称 | 参数类型 | 参数说明 | 参数数值 |
---|---|---|---|
RecordID | string | 数据唯一编号 | |
SmokeBlackID | string | 黑烟车唯一编码 | |
SiteID | int | 站点编号 | |
Lane | int | 车道号 | |
PassTime | string | 通过时间 | |
RegMark | string | 车牌号 | |
RegColor | string | 车牌颜色 | |
RegCondition | int | 车牌识别的可信度 | |
EnvFlagLimite | int | 环保标志限行号 | 0或者1 |
TailNumLimite | int | 尾气数限制 | |
IsSmokeBlack | int | 是否黑烟车 | 0 是 1不是 |
Speed | string | 速度 | |
Acc | string | 加速度 | |
CarLen | string | 车长 | |
Pic | string | 图片 | Base64编码 |
返回格式:
参数名称 | 参数类型 | 参数说明 | 参数数值 |
---|---|---|---|
rc | boolean | 调用是否成功 | true或者false |
str | string | 返回入库成功与否等提示信息 | string |
使用Postman请求如下的JSON数据:
{
"RecordID":"1125",
"SmokeBlackID":"1125",
"SiteID": 4,
"Lane": 1,
"PassTime": "2020-01-01T00:06:00.22",
"RegMark": "京N896P9",
"RegColor": "蓝",
"RegCondition": 89,
"EnvFlagLimite": 0,
"TailNumLimite": 0,
"IsSmokeBlack": "0",
"Speed": "10",
"Acc": "2",
"CarLen": "4",
"Pic": "/9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAQDAwMDAgQDAwMEBAQFBgoGBgUFBgwICQcKDgwPDg4MDQ0PERYTDxAVEQ0NExoTFRcYGRkZDxIbHRsYHRYYGRj/2wBDAQQEBAYFBgsGBgsYEA0QGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBj/2wBDAgQEBAYFBgsGBgsYEA0QGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBj/wAARCAQ4B4ADASIAAhEBAxEC/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtRKpKqzLhikZyH9W5r1j46f8lV0r/sFx/+hNXj8nRfq3869eLvFNnM1qf/2Q******************=="
}
由于Pic字段的base64编码数据太大,此处我省略了许多。 相应的接口代码如下:
/**
* 插入车流量信息表CarFlow
*/
router.post('/insertCarFlowRecord', function(req, res) {
let RecordID = req.body.RecordID; // 数据唯一编号
let SmokeBlackID = req.body.SmokeBlackID; // 黑烟车唯一编号
let SiteID = req.body.SiteID; // 站点编号
let Lane = req.body.Lane; // 车道号
let PassTime = req.body.PassTime; // 通过时间
let RegMark = req.body.RegMark; // 车牌号
let RegColor = req.body.RegColor; // 车牌颜色
let RegCondition = req.body.RegCondition; // 车牌识别的可信度
let EnvFlagLimite = req.body.EnvFlagLimite; // 环保标志限行号
let TailNumLimite = req.body.TailNumLimite; // 尾气数限制
let IsSmokeBlack = req.body.IsSmokeBlack; // 是否黑烟车
let Speed = req.body.Speed; // 速度
let Acc = req.body.Acc; // 加速度
let CarLen = req.body.CarLen; // 车长
let Pic = req.body.Pic; // 图片
if (RecordID == undefined || SmokeBlackID == undefined || SiteID == undefined || Lane == undefined ||
PassTime == undefined || RegMark == undefined || RegColor == undefined ||
RegCondition == undefined || EnvFlagLimite == undefined || TailNumLimite == undefined ||
IsSmokeBlack == undefined || Speed == undefined || Acc == undefined || CarLen == undefined || Pic == undefined ) {
return res.send({
rc: false,
str: '参数不全或不对,请将信息填充完整!'
});
}
if (IsSmokeBlack != 1 && IsSmokeBlack != 0) {
return res.send({
rc: false,
str: 'IsPass取值为0或1,请重新填写!'
});
}
// 入库前,先判断该RecordID在数据库中是否已经存在
serviceObj.DBClient.isExistRecordInCarFlowTable(RecordID, function(err, result) {
if (result === true) {
return res.send({
rc: false,
str: `遥测记录ID '${RecordID}' 已经存在`
})
}
});
// 如果RecordID不存在,则入库
serviceObj.DBClient.insertCarFlowRecord(req.body, function(err,result) {
if (result === true) {
return res.send({
rc: true,
str: '入库成功'
});
} else {
return res.send({
rc:false,
str: '入库失败'
});
}
});
});
报错如下:
后来查了一下这个错误,原来是nodejs 服务器,在传输内容或者上传文件时,系统默认大小为100kb,这时,我们需要修改系统限制。 HTTP请求时,POST PUT方法理论上,没有参数大小限制。但实际中在服务器端,会限制HTTP请求的大小。所以会出现带大参数的请求服务器无法响应的情况。 特别是在使用富文本编辑器图片采用Base64编码的情况下,默认的1MB的请求参数大小很容易超过,因此,需要修改HTTP请求的大小限制。 在Node.JS的app.js或者server.js中,在bodyparser中修改这个限制即可:
app.use(bodyParser.json({limit:'100mb'}));
app.use(bodyParser.urlencoded({ limit:'100mb', extended: true }));
修改代码后重启服务程序,在Postman中提交请求,