从NodeJS中的base64字符串创建图像

时间:2014-03-27 12:40:15

标签: image node.js base64 ajax-upload

我正在尝试上传从我的画布中提取并通过ajax发布的图片,而我在服务器端创建图像文件时遇到了问题。

我已经按照这个答案: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 );
});

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

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


修改

我也在这里尝试了解决方案:https://stackoverflow.com/a/6933413/1358670但我仍有同样的问题


编辑:2

我已经测试了我的前端端,在服务器端使用PHP脚本,并且生成的图像非常好,所以我会得出结论,问题出在我的NodeJS代码中。

1 个答案:

答案 0 :(得分:4)

问题在于对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);

我不知道它对别人是如何起作用的,但是对于我来说,用base +替换了每个空格+解决了我的问题。


新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);
});
相关问题