axios 数据流请求
时间: 2025-05-26 08:15:31 浏览: 15
### 使用 Axios 实现数据流请求
Axios 并不直接支持传统的文件上传或下载的数据流(Stream)操作,因为它主要设计为基于 Promise 的 HTTP 客户端。然而,在某些场景下可以通过特定的方式模拟或实现类似数据流的行为。
#### 文件下载作为数据流
对于文件下载的情况,可以设置 ` responseType` 为 `'stream'` 或 `'arraybuffer'` 来处理大文件的逐步读取[^2]。以下是通过 Axios 下载文件并将其写入本地磁盘的一个示例:
```javascript
const fs = require('fs');
const axios = require('axios');
async function downloadFile(url, outputPath) {
try {
const response = await axios({
url,
method: 'GET',
responseType: 'stream', // 设置响应类型为 stream
});
const writer = fs.createWriteStream(outputPath);
response.data.pipe(writer); // 将响应数据管道化到文件写入流
return new Promise((resolve, reject) => {
writer.on('finish', resolve);
writer.on('error', reject);
});
} catch (error) {
console.error(`文件下载失败: ${error.message}`);
}
}
// 调用函数
downloadFile('https://example.com/large-file.zip', './large-file.zip').then(() => {
console.log('文件已成功下载');
});
```
此代码片段中设置了 `responseType` 参数为 `'stream'`,从而允许将接收到的数据逐步传递给 Node.js 的文件写入流[^2]。
#### 文件上传作为数据流
当需要上传大型文件时,也可以借助 `FormData` 和 Axios 提供的支持来分批传输数据。下面展示的是一个简单的文件上传例子:
```javascript
const axios = require('axios');
const fs = require('fs');
function uploadFile(fileUrl, uploadUrl) {
const fileStream = fs.createReadStream(fileUrl);
const formData = new FormData();
formData.append('file', fileStream);
return axios.post(uploadUrl, formData, {
headers: {
...formData.getHeaders(),
},
});
}
uploadFile('./large-file.zip', 'https://example.com/upload')
.then(response => console.log(response))
.catch(error => console.error(error));
```
在此处,我们创建了一个可读流 (`Readable Stream`) 并附加到了表单数据对象中[^3]。这样能够有效地管理内存占用量,尤其适用于超大规模文件的操作。
#### 取消正在进行中的请求
为了进一步增强控制能力,可以在必要时候终止未完成的请求。这通常涉及使用 Axios 的取消令牌功能[^4]:
```javascript
const CancelToken = axios.CancelToken;
let cancel;
try {
const result = await axios.get('/long-process', {
cancelToken: new CancelToken(function executor(c) {
cancel = c; // 存储取消函数以便稍后调用
}),
});
} catch (thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled:', thrown.message);
} else {
throw thrown; // 处理其他异常情况
}
}
if (someConditionToAbort) {
cancel('Operation was aborted by the user.');
}
```
以上介绍了几种常见的利用 Axios 执行数据流请求的技术手段及其应用场景。
阅读全文
相关推荐


















