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

45 lines
1.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 参考
- 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);
```