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' кажется пустым.

Заранее спасибо!

11 ответов

Решение

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

Если кто-то сталкивается с той же проблемой при использовании axios в качестве http-клиента, решение состоит в том, чтобы добавить свойство responseType к параметрам запроса со значением 'arraybuffer':

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

Надеюсь это поможет

ПОСЛЕДНЕЕ, НА КОНЕЦ 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(...) здесь

Другой способ использования выборки узла, который разбивает шаги по каждой переменной:

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

Если вы знаете тип изображения, это однострочный с node-fetch пакет. Может подойти не всем, но у меня уже было node-fetch как зависимость, так что в случае, если другие находятся в аналогичной лодке:

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

Если вы используете 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;

вы можете проверить с помощью декодера base64.

Вы можете использовать модуль Node.js base64-stream, который является потоковым кодером / декодером 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);
});

Я использую для загрузки и кодирования изображения в модуль npm строки base64 node-base64-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);
});

Кодировать локальное изображение:

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

Старый пост, но может помочь кому-то. На основании ответа Дмитрия, помогите мне.

      const base64FromUrl = async (url: string) => {
  try {
    return Buffer.from((await axios.get(url, { responseType: "arraybuffer", })).data, "utf-8").toString("base64")
  } catch (error) {
    return ""
  }
}

Я просто добавил обработку ошибок.

Один лайнер:

      Buffer.from(
    (
      await axios.get(image, {
      responseType: "arraybuffer",
    })
  ).data,
  "utf-8"
).toString("base64")

Вы можете использовать модуль image-to-base64 Node.js

Преимущество использования этого модуля заключается в том, что вы без проблем конвертируете свое изображение.

Другие вопросы по тегам