本地启服务测试,没问题. 将代码更新到服务器(centOS6.8)之后. 测试图片上传.报这个错: ERR_CONTENT_LENGTH_MISMATCH 处理请求的代码: try{ var imgData = req.body.headPortrait; var userId = req.body.userId;
var base64Data = imgData.replace(/^data:image\/\w+;base64,/, "");
var dataBuffer = new Buffer(base64Data, 'base64');
//将buffer写成文件,文件名如果重名的话.则会覆盖
fs.writeFile('./public/uploads/headPortrait'+userId+'.jpg',dataBuffer,function(err){
console.log(err);
});
var user = userService.updateUser({'headPortrait':'/uploads/headPortrait'+userId+'.jpg'},userId);
console.log(user.get({'plain': true}));
return res.json("上传成功!");
}catch(e){
return res.json("错误信息:"+e.description );
}
代码意思是.将传过来的的图片转成buffer然后存入指定的目录 再调用自己定义的userService.updateUser()方法,存入数据库. 我在网上查询了下这个错误.说可能是 用户/目录权限的问题. 但是没有找到解决方案. 前不久才开始玩centOS的.这方面不是很懂. 麻烦各位大大,看下可能的解决问题的方法.
@hyj1991 老哥,又要呼叫你了.
@LowLoop 。。。如果确认是权限的问题,用 sudo / root 权限启动下应用再试试 话说我看你代码:
fs.writeFile('./public/uploads/headPortrait'+userId+'.jpg',dataBuffer,function(err){
console.log(err);
});
var user = userService.updateUser({'headPortrait':'/uploads/headPortrait'+userId+'.jpg'},userId);
console.log(user.get({'plain': true}));
return res.json("上传成功!");
这是没写成功就返回上传成功提示了啊,这样子不会出问题吧
@hyj1991 这个return是在 try{} 里面.如果出错就会跳到catch{}里面的return了… 应该没问题吧?
@LowLoop fs.writeFile
这个函数是异步把图片写入文件,你 try{} catch(){}
不到的,而且这里的两个 return 写不写无所谓
@hyj1991 .这是我.上传图片后.服务器上打印的日志(我用的pm2启动的node项目): 2|low | 2017-06-22 14:31 +08:00: GET /javascripts/floatBtns.js?v=7ed0f5b196 304 0.270 ms - - 2|low | 2017-06-22 14:33 +08:00: 头像头像头像头像头像头像 PM2 | Change detected on path public/uploads/headPortrait2.jpg for app low - restarting PM2 | Stopping app:low id:2 2|low | 2017-06-22 14:33 +08:00: Promise { 2|low | _bitField: 0, 2|low | _fulfillmentHandler0: undefined, 2|low | _rejectionHandler0: undefined, 2|low | _promise0: undefined, 2|low | _receiver0: undefined } PM2 | App [low] with id [2] and pid [18169], exited with code [0] via signal [SIGINT] PM2 | pid=18169 msg=process killed PM2 | Starting execution sequence in -fork mode- for app name:low id:2 PM2 | App name:low id:2 online 这是前端.console报错: 然后服务器上.指定保存的目录有这张图片: 但是数据库的记录里面相应字段没有保存值, 依旧是null
@LowLoop 不清楚了,得找别人问下,没有代码本地也没法复现错误,光看你的日志看不出是什么问题,你先用 root / sudo 启动下应用看看还有这个问题不
Change detected on path public/uploads/headPortrait2.jpg for app low - restarting
为什么要重启呢?
@mabu233 这是它自动重启. 应该pm2 的问题吧… 我也想解决这个问题.但不知道咋整. 它貌似,那个图片一发生改变就自动重启一次. 你有什么好的解决方法吗?
@LowLoop 这难道不是你启动pm2 时指定了 --watch ? 你要不就把图片放到别的目录, 要不就不要启用 --watch
//代码逻辑太不严谨,改一下 ` var f = path.join(__dirname, ‘public’, ‘uploads’, ‘headPortrait’ + userId + ‘.jpg’); fs.writeFile(f, dataBuffer, function (err) { if (err) { //上传出现错误 console.log(err); return res.json(“上传失败!”); } else {
//上传成功,存数据库
var user = userService.updateUser({'headPortrait': '/uploads/headPortrait' + userId + '.jpg'}, userId);
user.then(function (rlt) {
return res.json("成功!");
}, function (err) {
console.log(err);
return res.json("写数据库失败!");
}).catch(function (error) {
console.log(error);
return res.json("写数据库异常!");
})
}
});`
@mabu233 把 watch 这条 去掉还是?
@WindTrace 老哥,换成你改过的代码.就没报错了.谢谢你哈~ 不过 我把这个 var f = path.join(__dirname, ‘public’, ‘uploads’, ‘headPortrait’ + userId + ‘.jpg’); 因为我项目的原因.我换成了. var f = path.join(’./public’, ‘uploads’, ‘headPortrait’ + userId + ‘.jpg’); @hyj1991 @mabu233 谢谢各位了.