使用 Axios 来下载二进制 Excel 文件并实现中断和续传。以下是一种基本的实现方法:
1、在开始下载之前,确保您的项目中已经使用了 Axios(可以通过使用 npm 或者 yarn 进行安装)。
2、创建一个用于下载的函数,并使用 axios.get() 来发起文件下载请求。如下所示:
javascript
const axios = require('axios');
const fs = require('fs');
// 下载函数
async function downloadExcelFile(url, outputPath, headers = {}) {
const writer = fs.createWriteStream(outputPath, { flags: 'a' });
const response = await axios.get(url, {
responseType: 'stream',
headers,
});
response.data.pipe(writer);
// 返回一个 Promise,以便在外部处理下载过程
return new Promise((resolve, reject) => {
writer.on('finish', resolve);
writer.on('error', reject);
});
}
// 调用下载函数
downloadExcelFile('http://example.com/excel-file.xls', 'output.xls')
.then(() => {
console.log('文件下载完成');
})
.catch((error) => {
console.error('文件下载失败', error);
});
3、在现有的下载函数中添加中断和续传的支持,可以使用 range 请求头来控制请求的块位置。修改下载函数如下:
javascript
const axios = require('axios');
const fs = require('fs');
// 下载函数
async function downloadExcelFile(url, outputPath, headers = {}) {
let startByte = 0;
if (fs.existsSync(outputPath)) {
// 如果已经存在输出文件,则获取已下载的文件大小
const stats = fs.statSync(outputPath);
startByte = stats.size;
// 通过设置 Range 请求头来指定从哪个位置继续下载
headers['Range'] = `bytes=${startByte}-`;
}
const writer = fs.createWriteStream(outputPath, { flags: 'a' });
const response = await axios.get(url, {
responseType: 'stream',
headers,
});
response.data.pipe(writer);
// 返回一个 Promise,以便在外部处理下载过程
return new Promise((resolve, reject) => {
writer.on('finish', resolve);
writer.on('error', reject);
});
}
// 调用下载函数
downloadExcelFile('http://example.com/excel-file.xls', 'output.xls')
.then(() => {
console.log('文件下载完成');
})
.catch((error) => {
console.error('文件下载失败', error);
});
通过以上修改,下载函数将会检查是否已存在输出文件。如果存在,则使用 Range
请求头指定从已下载的文件大小开始继续下载,实现了中断和续传的功能。
请注意,服务器必须支持并正确处理 Range
请求头,同时确保文件内容正确的传输和续传。确保服务器端已正确设置了响应头信息。前端的断点续传实际上是基于服务器端的支持和协议的。