84

我正在尝试从网络上获取图像并使用 base64 对其进行编码。

我到目前为止基本上是:

var request = require('request');
var BufferList = require('bufferlist').BufferList;

bl = new BufferList(),

request({uri:'http://tinypng.org/images/example-shrunk-8cadd4c7.png',responseBodyStream: bl}, function (error, response, body) 
{
    if (!error && response.statusCode == 200) 
    {
        var type = response.headers["content-type"];
        var prefix = "data:" + type + ";base64,";
        var base64 = new Buffer(bl.toString(), 'binary').toString('base64');
        var data = prefix + base64;
        console.log(data);
    }
});

这似乎非常接近解决方案,但我无法让它工作。它识别数据类型并给出输出:

data:image/png;base64

但是缓冲区列表“bl”似乎是空的。

提前致谢!

4

9 回答 9

168

BufferList 已过时,因为它的功能现在在 Node 核心中。这里唯一棘手的部分是设置请求不使用任何编码:

var request = require('request').defaults({ encoding: null });

request.get('http://tinypng.org/images/example-shrunk-8cadd4c7.png', function (error, response, body) {
    if (!error && response.statusCode == 200) {
        data = "data:" + response.headers["content-type"] + ";base64," + Buffer.from(body).toString('base64');
        console.log(data);
    }
});
于 2013-06-16T11:51:41.073 回答
39

最新,截至 2017 年底

好吧,在阅读了上面的答案和一些研究之后,我知道了一种不需要任何软件包安装的新方法,http模块(内置)就足够了!

注意:我在节点版本 6.x 中使用过它,所以我猜它也适用于上述版本。

var http = require('http');

http.get('http://tinypng.org/images/example-shrunk-8cadd4c7.png', (resp) => {
    resp.setEncoding('base64');
    body = "data:" + resp.headers["content-type"] + ";base64,";
    resp.on('data', (data) => { body += data});
    resp.on('end', () => {
        console.log(body);
        //return res.json({result: body, status: 'success'});
    });
}).on('error', (e) => {
    console.log(`Got error: ${e.message}`);
});

我希望它有帮助!

另外,查看更多关于http.get(...) 这里

于 2017-11-30T06:36:38.703 回答
39

如果有人在使用 axios 作为 http 客户端时遇到同样的问题,解决方案是将 responseType 属性添加到值为 'arraybuffer' 的请求选项中:

let image = await axios.get('http://aaa.bbb/image.png', {responseType: 'arraybuffer'});
let returnedB64 = Buffer.from(image.data).toString('base64');

希望这可以帮助

于 2018-10-04T13:31:06.627 回答
12

如果您知道图像类型,则它是带有node-fetch包装的单衬里。可能不适合每个人,但我已经有了node-fetch依赖,所以如果其他人也有类似的情况:

await fetch(url).then(r => r.buffer()).then(buf => `data:image/${type};base64,`+buf.toString('base64'));
于 2018-09-23T15:03:24.490 回答
8

您可以使用base64-stream Node.js 模块,它是一个流式 Base64 编码器/解码器。这种方法的好处是您可以转换图像,而无需将整个内容缓冲到内存中,也无需使用请求模块。

var http = require('http');
var base64encode = require('base64-stream').Encode;

http.get('http://tinypng.org/images/example-shrunk-8cadd4c7.png', function(res) {
    if (res.statusCode === 200)
        res.pipe(base64encode()).pipe(process.stdout);
});
于 2013-07-09T05:55:33.583 回答
7

如果您使用的是 axios,那么您可以按照以下步骤操作

var axios = require('axios');
const url ="put your url here";
const image = await axios.get(url, {responseType: 'arraybuffer'});
const raw = Buffer.from(image.data).toString('base64');
const base64Image = "data:" + image.headers["content-type"] + ";base64,"+raw;

您可以使用 decode base64 进行检查。

于 2021-03-02T11:50:00.403 回答
5

另一种使用节点获取的方法,它分解了每个变量的步骤:

const fetch = require('node-fetch');

const imageUrl = "Your URL here";
const imageUrlData = await fetch(imageUrl);
const buffer = await imageUrlData.buffer();
const contentType = await imageUrlData.headers.get('content-type');
const imageBas64 = 
`data:image/${contentType};base64,`+buffer.toString('base64');
于 2021-05-21T00:25:16.200 回答
2

我用于将图像加载和编码到 base64 字符串node-base64-image npm 模块中。

下载并编码图像:

var base64 = require('node-base64-image');

var options = {string: true};
base64.base64encoder('www.someurl.com/image.jpg', options, function (err, image) {
    if (err) {
        console.log(err);
    }
    console.log(image);
});

编码本地图像:

var base64 = require('node-base64-image');

var path = __dirname + '/../test.jpg',
options = {localFile: true, string: true};
base64.base64encoder(path, options, function (err, image) {  
    if (err) { console.log(err); }  
    console.log(image);  
}); 
于 2016-04-28T00:35:28.883 回答
1

单线:

Buffer.from(
    (
      await axios.get(image, {
      responseType: "arraybuffer",
    })
  ).data,
  "utf-8"
).toString("base64")
于 2021-06-30T19:16:41.523 回答