NodeJS записывает файл изображения base64

Мой NodeJS-сервер получает кодировку base64.

data:image/jpeg;base64,/9j/4QCcRXhpZgAASUkqAAgAAAA ... CiiigD//Z

Полученные данные должны быть сохранены как jpg. Поэтому я использую Buffer и FileSystemWriter:

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

fs.writeFile не вызывает ошибку. Файл jpeg сохраняется, но я не могу его открыть. Image-Viewer говорит:

File is damaged or too big.

Исходный файл имеет размер 6kb и новый файл 7kb.

Ответ 1

Вам нужно удалить из него метаинформацию, часть 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 ...> }

Затем вы можете сохранить буфер, используя указанный выше метод.

fs.writeFile('test.jpg', imageBuffer.data, function(err) { ... });

Ответ 2

Другим способом является использование 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
});

Ответ 3

попробуйте этот простой способ

 var imgData = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA..kJggg==';
var base64Data = imgData.replace(/^data:image\/png;base64,/, "");


require("fs").writeFile("out.png", base64Data, 'base64', 
function(err, data) {
if (err) {
    console.log('err', err);
}
console.log('success');

});

focuse здесь 1) data:image/png;base здесь png 2) replace(/^data:image\/png; здесь тоже png, а имя должно сохранить с помощью 3) writeFile("out.png png