返回
大文件无忧,OSS分片上传+断点续传方案助你搞定!
前端
2023-10-23 21:49:56
分片上传:告别大文件上传难题
面临的挑战
上传大文件时,我们常遇到网络不稳定、程序崩溃等突发情况,导致上传中断,需要重新上传。此外,大文件上传占用大量带宽,影响其他网络应用的正常使用。更为不便的是,上传大文件时无法实时跟踪进度,用户体验不佳。
分片上传的救赎
阿里云OSS的分片上传功能,将大文件分割成多个小片,分别上传至OSS服务器。上传中断时,可从断点处继续上传,无需重新上传整个文件。
node.js、axios和egg.js的组合技
结合node.js、axios和egg.js框架,我们可以轻松实现断点续传功能。
分片上传原理
分片上传将大文件分割成小片,每个小片的建议大小为1MB-5MB。小片上传完成后,OSS会自动将它们合并成一个完整的文件。
分片上传流程
- 初始化分片上传: 向OSS发起分片上传请求,获取上传ID。
- 上传分片: 将文件分片上传至OSS,并记录每个分片的信息(如分片号、ETag)。
- 完成分片上传: 当所有分片上传完成后,向OSS发起完成分片上传请求,OSS会自动将分片合并成一个完整的文件。
实现步骤
1. 安装依赖
npm install axios egg-oss
2. 初始化OSS客户端
const OSS = require('egg-oss');
const client = new OSS({
accessKeyId: '<your-access-key-id>',
accessKeySecret: '<your-access-key-secret>',
region: '<your-region>',
bucket: '<your-bucket-name>'
});
3. 初始化分片上传
const result = await client.initiateMultipartUpload('<your-object-name>');
const uploadId = result.res.UploadId;
4. 上传分片
const partNumber = 1;
const file = fs.readFileSync('<your-file-path>');
const result = await client.uploadPart(uploadId, partNumber, file);
const etag = result.res.ETag;
5. 完成分片上传
const parts = [{
PartNumber: 1,
ETag: etag
}];
const result = await client.completeMultipartUpload(uploadId, parts);
6. 断点续传实现
断点续传需记录已上传的分片信息,上传中断时可从断点处继续上传。
let uploadedParts = [];
const uploadPart = async (partNumber, file) => {
const result = await client.uploadPart(uploadId, partNumber, file);
uploadedParts.push({
PartNumber: partNumber,
ETag: result.res.ETag
});
};
上传中断时,从uploadedParts中获取已上传的分片信息,从断点处继续上传:
const result = await client.completeMultipartUpload(uploadId, uploadedParts);
常见问题解答
1. 分片大小如何选择?
分片大小一般为1MB-5MB,根据文件大小和网络情况而定。
2. 如何保证分片上传的可靠性?
OSS会自动校验每个分片的完整性,并提供重试机制。
3. 断点续传如何实现?
需要记录已上传的分片信息,上传中断时可从断点处继续上传。
4. 分片数量上限?
一个分片上传任务最多支持10000个分片。
5. 大文件上传失败,如何排查?
检查分片上传的状态,查看是否有失败的分片,然后重试上传失败的分片。
结语
分片上传+断点续传是解决大文件上传难题的有效方案,大幅提升上传速度和可靠性。结合node.js、axios和egg.js框架,我们可以轻松实现断点续传功能,为用户提供更佳的上传体验。