【问题标题】:Creating image from base64 string in NodeJS在 NodeJS 中从 base64 字符串创建图像
【发布时间】:2014-05-06 10:41:37
【问题描述】:

我正在尝试上传从画布中提取并通过 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 代码中。

【问题讨论】:

  • 我没有立即跳出来,但是你有没有比较 PHP 和 Node 的文件,看看是否有明显的区别?不同的长度,不同的数据?还有一个更简单的方法:fs.writeFileSync('./img.jpeg', req.body.image.replace(/^data:image\/\w+;base64,/, ""), {encoding: 'base64'})
  • 是的,我已经尝试过您指定的更简单的方法,而且我在 NodeJS 中获取了我的 base64 代码,将其写入文本文件,然后在我的 PHP 脚本中使用文本文件中的确切字符串,它奏效了
  • 您能否上传一个小 jpg 并在问题中发布 base64 以及正在运行的 PHP 版本?
  • 感谢@loganfsmyth 的支持,我找到了解决问题的方法,请查看我的回答
  • 很好,很高兴你知道了。我能问一下你用什么来填充req.body.image吗?你在使用 express bodyParser 吗?您如何填充 POST 数据客户端? Base64 不会将空格视为加号,但这种转换可能会在其他地方引入。

标签: image node.js base64 ajax-upload


【解决方案1】:

问题在于对 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 中的每个空间解决了我的问题。


新的 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);
});

【讨论】:

  • 谢谢,我在从 iOS 到 NodeJS 的 base64 图像上遇到了同样的问题。
猜你喜欢
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 1970-01-01
相关资源
最近更新 更多