将axios图像流在Base64编码后转换为字符串?

3

到目前为止,我已经有了这个:

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())

这个base64编码了图片,我们如何将其转换为字符串?我尝试过类似于以下的方法:

  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
请将 Buffer.concat(chunks).toString('utf8') 替换为 chunks.join("") - blex
1个回答

7
在你的例子中,你使用了Base64encode模块,该模块已经输出了字符串 - 所以这使得上面的例子失败了(除非是因为顶层的await导致的)。实际上,你不需要将块转换为字符串,因为它们已经是字符串,所以简单的连接即可。事实上,只需使用node.js流可能会简化整个过程10倍。
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);
})();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接