BlueRoseNote/07-Other/Node.js/在Nodejs中使用Axios下载文件的方法.md

1.6 KiB
Raw Blame History

参考

查看源码发现axios返回的内容默认是Stream格式的 如果没有设置responseType的话返回内容将会从Stream转为Buffer再转为String 如果responseType为stream的话不进行转换 如果responseType为arraybuffer的话将Stream转为Buffer 但是如果想把Buffer转为String再转回Buffer的话将会出问题(默认使用utf8进行Buffer的编码和解码)有的文件这样是可以的但是Excel文件这样做的话两次Buffer的值是不同的但是转为base64的话是都可以的。

设置responseType为stream

const result = await require('axios')({ url, method, data, responseType: 'stream' });
result.data.pipe(require('fs').createWriteStream(saveFilePath));

提供buffer转Stream并保存为文件的方法

function bufferToStream(bufferData, saveFilePath) {
  return new Promise((res, rej) => {
    const bufferStream = new stream.PassThrough();
    bufferStream.end(bufferData);
    const ws = fs.createWriteStream(saveFilePath);
    bufferStream.pipe(ws).on('finish', () => {
      res(saveFilePath);
    });
  });
}

设置responseType为arraybuffer

const result = await require('axios')({ url, method, data, responseType: 'arraybuffer' });
const bufferData = result.data;
await bufferToStream(bufferData, saveFilePath);

不设置responseType设置responseEncoding为base64

const result = await require('axios')({ url, method, data, responseEncoding: 'base64' });
const bufferData = Buffer.from(result.data, 'base64');
await bufferToStream(bufferData, saveFilePath);