it-swarm.com.de

Node.js erhält ein Bild aus dem Web und codiert mit base64

Ich versuche, ein Bild aus dem Web abzurufen und es mit base64 zu kodieren.

was ich bisher habe, ist im Grunde:

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

Dies scheint ziemlich nahe an der Lösung zu liegen, aber ich kann es nicht ganz schaffen. Es erkennt den Datentyp und gibt die Ausgabe aus:

data:image/png;base64

die Pufferliste 'bl' scheint jedoch leer zu sein.

Danke im Voraus!

35
Aleksr9

BufferList ist veraltet, da die Funktionalität jetzt im Node-Kern liegt. Der einzige schwierige Teil hier ist das Festlegen der Anforderung, keine Codierung zu verwenden:

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

LATEST, AS 2017 ENDE

Nun, nachdem ich die obigen Antworten gelesen und ein wenig recherchiert hatte, lernte ich einen neuen Weg kennen, der erfordert keine Paketinstallation, http Modul (das eingebaut ist) reicht!

NOTE: Ich habe es in der Knotenversion 6.x verwendet, daher denke ich, dass es auch für die obigen Versionen gilt.

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

Ich hoffe, es hilft!

Mehr über die http.get(...)hier !

13
Ankur Shah

Sie können das Modul base64-stream Node.js verwenden, bei dem es sich um einen Base64-Encoder/-Decoder handelt. Der Vorteil dieser Methode besteht darin, dass Sie das Bild konvertieren können, ohne das Ganze in den Speicher zu puffern und ohne das Anforderungsmodul zu verwenden.

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

Wenn bei der Verwendung von axios wie beim http-Client ein Problem auftritt, müssen Sie die responseType -Eigenschaft den Anforderungsoptionen mit dem Wert 'arraybuffer' hinzufügen:

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

Hoffe das hilft

4
Yehuda

Ich benutze zum Laden und Codieren von Bildern in base64 string node-base64-image npm Modul 

Laden Sie ein Bild herunter und kodieren Sie es:

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

Kodieren Sie ein lokales Bild:

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

Wenn Sie den Bildtyp kennen, handelt es sich um einen Einzeiler mit dem node-fetch-Paket. Könnte nicht für jeden geeignet sein, aber ich hatte bereits node-fetch als Abhängigkeit, also für den Fall, dass sich andere in einem ähnlichen Boot befinden:

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