如何解析Node中的数据URL?

a p*_*erd 31 url base64 node.js

我有一个这样的数据网址:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ley 60

使用'base64'编码将数据放入Buffer中,然后将其写入文件:

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 = new Buffer(data, 'base64');
fs.writeFileSync('data.' + ext, buffer);
Run Code Online (Sandbox Code Playgroud)

  • 大型数据URI上的RegEx非常密集CPU /速度.最好避免. (7认同)
  • 虽然这种方法有效但正则表达式可能会产生非常大的性能影响.在我的机器上,使用正则表达式比使用分割(约5200ms而不是27ms)慢约192倍.因此,如果您的数据URL代表合理大小的图像(~300KB),这几乎不起作用. (4认同)
  • 怎么样`var data = string.substr(string.indexOf('base64')+ 7)`? (3认同)
  • 如果不是PNG怎么办? (2认同)
  • 这太慢了。使用拆分要好得多。 (2认同)
  • 数据 URI 的数据内容可能**不是**采用 base64。它可以处理“data:,”(这是一个完全有效的_data URI_)吗? (2认同)

ber*_*ert 21

试试这个

var dataUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";
var buffer = new Buffer(dataUrl.split(",")[1], 'base64');
Run Code Online (Sandbox Code Playgroud)

  • 似乎这种方法现在已被弃用.我不得不使用它:`buffer = Buffer.from(dataUrl.split(",")[1],'base64')` (3认同)

GOT*_*O 0 5

我在研究 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');
Run Code Online (Sandbox Code Playgroud)

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

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

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