45 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			45 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								# 参考
							 | 
						|||
| 
								 | 
							
								- 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);
							 | 
						|||
| 
								 | 
							
								```
							 |