diff --git a/07-Other/Node.js/在Nodejs中使用Axios下载文件的方法.md b/07-Other/Node.js/在Nodejs中使用Axios下载文件的方法.md new file mode 100644 index 0000000..7214724 --- /dev/null +++ b/07-Other/Node.js/在Nodejs中使用Axios下载文件的方法.md @@ -0,0 +1,45 @@ +# 参考 +- https://blog.csdn.net/clearlxj/article/details/108264141 + +>查看源码发现axios返回的内容默认是Stream格式的; +如果没有设置responseType的话,返回内容将会从Stream转为Buffer再转为String; +如果responseType为stream的话不进行转换; +如果responseType为arraybuffer的话将Stream转为Buffer; +但是如果想把Buffer转为String再转回Buffer的话将会出问题(默认使用utf8进行Buffer的编码和解码),有的文件这样是可以的,但是Excel文件这样做的话两次Buffer的值是不同的;但是转为base64的话是都可以的。 + + +# 设置responseType为stream +```js +const result = await require('axios')({ url, method, data, responseType: 'stream' }); +result.data.pipe(require('fs').createWriteStream(saveFilePath)); +``` + + +提供buffer转Stream并保存为文件的方法 +```js +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 +```js +const result = await require('axios')({ url, method, data, responseType: 'arraybuffer' }); +const bufferData = result.data; +await bufferToStream(bufferData, saveFilePath); +``` + +# 不设置responseType,设置responseEncoding为base64 +```js +const result = await require('axios')({ url, method, data, responseEncoding: 'base64' }); +const bufferData = Buffer.from(result.data, 'base64'); +await bufferToStream(bufferData, saveFilePath); +``` \ No newline at end of file