web-dev-qa-db-fra.com

Node.js obtient une image du Web et code avec base64

J'essaie d'extraire une image du Web et de l'encoder avec Base64.

ce que j'ai jusqu'ici est fondamentalement:

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);
    }
});

Cela semble être assez proche de la solution, mais je ne parviens pas à la faire fonctionner. Il reconnaît le type de données et donne la sortie:

data:image/png;base64

cependant, la liste de tampons 'bl' semble être vide.

Merci d'avance!

35
Aleksr9

BufferList est obsolète, car ses fonctionnalités sont maintenant dans Node Core. La seule difficulté réside ici dans la définition de la demande de ne pas utiliser d’encodage:

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);
    }
});
101
dankohn

DERNIÈRE, EN 2017 CESSANT

Eh bien, après avoir lu les réponses ci-dessus et un peu de recherche, j'ai découvert une nouvelle méthode qui ne nécessite aucune installation de package, un module http (intégré) suffit!

NOTE: je l'ai utilisé dans la version de nœud 6.x, donc je suppose que cela s'applique également aux versions ci-dessus.

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}`);
});

J'espère que ça aide!

Aussi, vérifiez plus à propos de la http.get(...)here !

13
Ankur Shah

Vous pouvez utiliser le module base64-stream Node.js, qui est un encodeur/décodeur Base64 en continu. L'avantage de cette méthode est que vous pouvez convertir l'image sans avoir à mettre tout le tampon en mémoire tampon et sans utiliser le module de requête.

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);
});
8
Ross J

Si quelqu'un rencontre le même problème en utilisant axios que le client http, la solution consiste à ajouter la propriété responseType aux options de la requête avec la valeur 'arraybuffer':

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

J'espère que cela t'aides

4
Yehuda

J'utilise pour charger et encoder l'image dans le module base64 string node-base64-image npm. 

Téléchargez et encodez une image:

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);
});

Encoder une image locale:

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);  
}); 
1
webmato

Si vous connaissez le type d'image, il s'agit d'une couche avec le package node-fetch. Cela ne conviendrait peut-être pas à tout le monde, mais j'avais déjà node-fetch comme dépendance, donc si d'autres sont dans un bateau similaire:

await fetch(url).then(r => r.buffer()).then(buf => `data:image/${type};base64,`+buf.toString('base64'));
0
user993683