在NodeJS中从base64string创build图像

我试图上传一个图像,我从我的canvas提取和张贴通过AJAX,我无法在我的服务器端创build图像文件。

我有这样的回答: https : //stackoverflow.com/a/7347358/1358670但仍然我似乎错过了这里或那里的东西。

这是我的JavaScript(浏览器)代码:

var img = myCanvas.toDataURL("image/jpeg"); // ajax request to send the image 

在服务器端,我做了以下几点:

 var fd = fs.openSync('./img.jpeg', 'w'); req.body.image = req.body.image.replace(/^data:image\/\w+;base64,/, ""); console.log( req.body.image ); var buff = new Buffer(req.body.image, 'base64'); fs.write(fd, buff, 0, buff.length, 0, function(err,written){ console.log( ">> "+ err ); fs.closeSync( fd ); }); 

正如你所看到的,我已经logging了图像,看它是否正确发送,而且是,但仍然无法打开创build的img.jpeg文件

任何帮助或暗示是非常受欢迎的。


编辑

我也试过这里的解决scheme: https : //stackoverflow.com/a/6933413/1358670但我仍然有同样的问题


编辑:2

我已经testing了我的前端,在服务器端有一个PHP脚本,生成的图像非常好,所以我会得出结论,问题出在我的NodeJS代码中。

问题是在NodeJS的治疗,我没有怀疑的代码,因为它是一样的,每个人都评论说,它为他们工作,没有什么不同,所以我没有怀疑的过程,但要么做错了什么。

当在我的PHP脚本中检查它时,我发现一个不在NodeJS代码中的步骤,这里是PHP代码:

 $img = $_POST[ 'image' ]; $img = str_replace('data:image/jpeg;base64,', '', $img); $img = str_replace(' ', '+', $img); $data = base64_decode($img); $file = "./". uniqid() . '.png'; $success = file_put_contents($file, $data); print $success ? $file : 'Unable to save the file.'; 

不同之处在于: str_replace(' ', '+', $img);

我不知道它是如何工作的,但是对于我来说,用base64来replace每一个空间,解决了我的问题。


新的NodeJS代码

 req.body.image = req.body.image.replace(/^data:image\/\w+;base64,/, ""); req.body.image = req.body.image.replace(/ /g, '+'); console.log( req.body.image ); var buff = new Buffer(req.body.image, 'base64'); fs.write(fd, buff, 0, buff.length, 0, function(err,written){ console.log( ">> "+ err ); fs.closeSync( fd ); }); 

我希望这会帮助别人


更好的代码版本:

 req.body.image = req.body.image.replace(/^data:image\/jpeg+;base64,/, ""); req.body.image = req.body.image.replace(/ /g, '+'); fs.writeFile('./records/'+model+'/out.jpeg', req.body.image, 'base64', function(err) { console.log(err); }); 
Interesting Posts