Node.js получить изображение из сети и закодировать с base64
Я пытаюсь получить изображение из Интернета и закодировать его с помощью 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' кажется пустым.
Спасибо заранее!
Ответы
Ответ 1
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);
}
});
Ответ 2
ПОСЛЕДНЕЕ, НА КОНЕЦ 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(...)
здесь !
Ответ 3
Вы можете использовать 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);
});
Ответ 4
Если кто-то сталкивается с той же проблемой при использовании axios в качестве http-клиента, решение состоит в том, чтобы добавить свойство responseType к параметрам запроса со значением 'arraybuffer':
let image = await axios.get('http://aaa.bbb/image.png', {responseType: 'arraybuffer'});
let returnedB64 = Buffer.from(image.data).toString('base64');
Надеюсь это поможет
Ответ 5
Я использую для загрузки и кодирования изображения в строку 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);
});
Ответ 6
Если вы знаете тип изображения, это однострочник с пакетом node-fetch
. Может подойти не всем, но у меня уже была зависимость от node-fetch
, так что если другие находятся в похожей лодке:
await fetch(url).then(r => r.buffer()).then(buf => 'data:image/${type};base64,'+buf.toString('base64'));