Превращение потока изображения ax ios в строку после Base64 Кодирование? - PullRequest
0 голосов
/ 28 марта 2020

Пока у меня есть это:

const Fs = require('fs')  
const Path = require('path')  
const Axios = require('axios')
var {Base64Encode} = require('base64-stream');

const url = 'https://unsplash.com/photos/AaEQmoufHLk/download?force=true'

const response = await Axios({
      url,
      method: 'GET',
      responseType: 'stream'
    })

response.data.pipe(new Base64Encode())

Эта база 64 кодирует изображение. Как мы можем превратить это в строку? Я пробовал что-то вроде этого:

  function streamToString (stream) {
    const chunks = []
    return new Promise((resolve, reject) => {
      stream.on('data', chunk => chunks.push(chunk))
      stream.on('error', reject)
      stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')))
    })
  }

const result = await streamToString(response.data.pipe(new Base64Encode()))

Но это ошибки. Мысли?

1 Ответ

1 голос
/ 02 апреля 2020

В вашем примере вы использовали модуль Base64encode, который уже выкачивает строки - так что в приведенном выше примере произошел сбой (если только это не произошло из-за ожидания верхнего уровня). На самом деле вам не нужно преобразовывать чанки в строки, так как они уже были строками, поэтому простая конкатенация подойдет.

На самом деле все может быть в 10 раз проще, если использовать только потоки node.js:

const Axios = require('axios')
const {PassThrough} = require("stream");

const url = 'https://unsplash.com/photos/AaEQmoufHLk/download?force=true';

(async function() {
    const response = await Axios({
        url,
        method: 'GET',
        responseType: 'stream'
    });

    // we just pipe the data (the input carries it's own encoding)
    // to a PassThrough node stream that outputs `base64`.
    const chunks = response.data
        .pipe(new PassThrough({encoding:'base64'}));

    // then we use an async generator to read the chunks
    let str = '';
    for await (let chunk of chunks) {
        str += chunk;
    }

    // et voila! :)
    console.log(str);
})();
...