返回

大文件无忧,OSS分片上传+断点续传方案助你搞定!

前端

分片上传:告别大文件上传难题

面临的挑战

上传大文件时,我们常遇到网络不稳定、程序崩溃等突发情况,导致上传中断,需要重新上传。此外,大文件上传占用大量带宽,影响其他网络应用的正常使用。更为不便的是,上传大文件时无法实时跟踪进度,用户体验不佳。

分片上传的救赎

阿里云OSS的分片上传功能,将大文件分割成多个小片,分别上传至OSS服务器。上传中断时,可从断点处继续上传,无需重新上传整个文件。

node.js、axios和egg.js的组合技

结合node.js、axios和egg.js框架,我们可以轻松实现断点续传功能。

分片上传原理

分片上传将大文件分割成小片,每个小片的建议大小为1MB-5MB。小片上传完成后,OSS会自动将它们合并成一个完整的文件。

分片上传流程

  1. 初始化分片上传: 向OSS发起分片上传请求,获取上传ID。
  2. 上传分片: 将文件分片上传至OSS,并记录每个分片的信息(如分片号、ETag)。
  3. 完成分片上传: 当所有分片上传完成后,向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框架,我们可以轻松实现断点续传功能,为用户提供更佳的上传体验。