NodeJS写入base64图像文件

mar*_*cel 50 node.js

我的NodeJS-Server接收到base64编码的图片.

data:image/jpeg;base64,/9j/4QCcRXhpZgAASUkqAAgAAAA ... CiiigD//Z
Run Code Online (Sandbox Code Playgroud)

收到的数据应保存为jpg.因此我使用Buffer和FileSystemWriter:

var imageBuffer = new Buffer(data, 'base64'); //console = <Buffer 75 ab 5a 8a ...
fs.writeFile("test.jpg", imageBuffer, function(err) { //... });
Run Code Online (Sandbox Code Playgroud)

fs.writeFile不会调用错误.保存了jpeg文件,但我无法打开它.Image-Viewer说:

File is damaged or too big.
Run Code Online (Sandbox Code Playgroud)

原始文件大6kb,新文件7kb.

Jul*_*gan 106

您必须从中删除网址元信息data:image/jpeg.(重申@CBroe所说的)这是一个从输入字符串返回正确信息的小函数.

var data = 'data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAA..kJggg==';

function decodeBase64Image(dataString) {
  var matches = dataString.match(/^data:([A-Za-z-+\/]+);base64,(.+)$/),
    response = {};

  if (matches.length !== 3) {
    return new Error('Invalid input string');
  }

  response.type = matches[1];
  response.data = new Buffer(matches[2], 'base64');

  return response;
}

var imageBuffer = decodeBase64Image(data);
console.log(imageBuffer);
// { type: 'image/jpeg',
//   data: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 00 b4 00 00 00 2b 08 06 00 00 00 d1 fd a2 a4 00 00 00 04 67 41 4d 41 00 00 af c8 37 05 8a e9 00 00 ...> }
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用上述方法保存缓冲区.

fs.writeFile('test.jpg', imageBuffer.data, function(err) { ... });
Run Code Online (Sandbox Code Playgroud)

  • 救了我的一天朱利安,工作完美.谢谢 (3认同)
  • 由于 `new Buffer` 已被弃用,您可以使用 `Buffer.from(matches[2], 'base64');` (3认同)
  • 通常,文件扩展名不会影响图像的解析.操作系统通常会做各种事情来自动更正"文件类型".我已经纠正了答案,以减少任何混乱. (2认同)

rol*_*lnn 30

另一种方法是在剥离元信息后使用fs.writeFile编码选项base64.

var image = 'data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAA..kJggg==';

var data = image.replace(/^data:image\/\w+;base64,/, '');

fs.writeFile(fileName, data, {encoding: 'base64'}, function(err){
  //Finished
});
Run Code Online (Sandbox Code Playgroud)