Node.js从web获取图像并使用base64进行编码

Ale*_*sr9 47 base64 encoding node.js express

我正在尝试从网络上获取图像并使用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);
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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

但缓冲列表'bl'似乎是空的.

提前致谢!

Dan*_*ohn 123

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," + new Buffer(body).toString('base64');
        console.log(data);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • `encoding:null`告诉请求你想要一个缓冲区,而不是一个字符串.字符串为您提供了不可用的乱码数据,因为base64的重点是编码二进制.我在自己的StackOverflow问题http://stackoverflow.com/questions/16619980/failing-mocha-test-on-hash-of-favicon-static-image中得到了有关编码的答案,所以我很乐意向前付款. (17认同)
  • 愿所有的上帝保佑你......我知道这是一个编码问题,但我正在努力寻找如何在请求库中禁用它...... (2认同)

Nic*_*ras 23

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

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

const imageUrl = "Your URL here";
const imageUrlData = await fetch(imageUrl);
const buffer = await imageUrlData.arrayBuffer();
const stringifiedBuffer = Buffer.from(buffer).toString('base64');
const contentType = imageUrlData.headers.get('content-type');
const imageBase64 = 
`data:${contentType};base64,${stringifiedBuffer}`;
Run Code Online (Sandbox Code Playgroud)


Ank*_*hah 20

最新消息,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}`);
});
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助!

另外,请查看http.get(...) 此处的更多信息!

  • 这有效.我必须在我的解决方案中同时使用http和https模块,因为今天大多数资源都是https.不幸的是,您需要手动检查要使用的模块.请参阅/sf/answers/3165055001/. (2认同)

小智 12

如果您使用的是 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;
Run Code Online (Sandbox Code Playgroud)

你可以用解码base64来检查。


Yeh*_*uda 10

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

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

希望这可以帮助


小智 9

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

await fetch(url).then(r => r.buffer()).then(buf => `data:image/${type};base64,`+buf.toString('base64'));
Run Code Online (Sandbox Code Playgroud)

  • 效果很好!`.buffer` 已被弃用。这是新的方式:`const blob =等待response.arrayBuffer(); 返回 \`data:${response.headers.get("content-type")};base64,${Buffer.from(blob).toString("base64")}\`;` (2认同)

小智 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);
});
Run Code Online (Sandbox Code Playgroud)