46

我有一个这样的数据 URL:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...

将其作为二进制数据(例如 a Buffer)以便我可以将其写入文件的最简单方法是什么?

4

5 回答 5

74

使用“base64”编码将数据放入缓冲区,然后将其写入文件:

var fs = require('fs');
var string = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";
var regex = /^data:.+\/(.+);base64,(.*)$/;

var matches = string.match(regex);
var ext = matches[1];
var data = matches[2];
var buffer = Buffer.from(data, 'base64');
fs.writeFileSync('data.' + ext, buffer);
于 2012-07-04T21:12:00.357 回答
29

尝试这个

var dataUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";
var buffer = new Buffer(dataUrl.split(",")[1], 'base64');
于 2014-06-04T18:14:26.083 回答
3

我最近也遇到了这样的问题(解析和验证数据 URL),并找到了以下解决方法:https ://gist.github.com/bgrins/6194623

我创建了 2 个包,以便在代码中更轻松地处理数据 URL。它们在这里: https://github.com/killmenot/valid-data-url
https://github.com/killmenot/parse-data-url

查看示例

于 2016-05-10T10:32:30.307 回答
1

我正在研究 Node.js 的源代码,并偶然发现了这段将数据 URL 解码为Buffer. 尽管该函数不是公开的并且专门用于解析编码的 ES 模块,但它揭示了一些其他答案显然没有考虑到的数据 URL 的方面:数据 URL 的内容不能是 base64 编码的,并且可能是 URL 编码的,并且它甚至可能是未编码的。

本质上,Node.js 逻辑归结为类似于下面的代码加上错误处理:

const parsed = new URL(url);
const match = /^[^/]+\/[^,;]+(?:[^,]*?)(;base64)?,([\s\S]*)$/.exec(parsed.pathname);
const { 1: base64, 2: body } = match;
const buffer = Buffer.from(decodeURIComponent(body), base64 ? 'base64' : 'utf8');

这将正确处理带有内容的 Javascript 文件的不同编码console.log("Node.js");

  • 数据:文本/javascript,console.log(“Node.js”);
  • 数据:文本/javascript,console.log(%22Node.js%22)%3B
  • 数据:文本/javascript;base64,Y29uc29sZS5sb2coIk5vZGUuanMiKTs=

如果需要,可以将生成的缓冲区转换为字符串buffer.toString()

于 2021-10-17T13:25:37.250 回答
0

这个方法对我有用




function dataURItoBlob(dataURI) {
  // convert base64 to raw binary data held in a string
  var data = dataURI.split(',')[1]; 
  var byteString = Buffer.from(data, "base64");

  // separate out the mime component
  var mimeString = dataURI.split(",")[0].split(":")[1].split(";")[0];

  // write the ArrayBuffer to a blob, and you're done
  var blob = new Blob([byteString], { type: mimeString  });
  return blob;
}

使用

var uri = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='; 
dataURItoBlob(uri)

于 2022-02-28T04:35:10.847 回答