不做大哥好多年 不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核

逍遥子

不做大哥好多年
首页
  • MySQL
  • Redis
  • Elasticsearch
  • Kafka
  • Etcd
  • MongoDB
  • TiDB
  • RabbitMQ
  • 01.Python
  • 02.GO
  • 03.Java
  • 04.业务问题
  • 05.关键技术
  • 06.项目常识
  • 10.计算机基础
  • Docker
  • K8S
  • 容器原理
  • Istio
  • 01.GO基础
  • 02.面向对象
  • 03.并发编程
  • 04.常用库
  • 05.数据库操作
  • 06.Beego框架
  • 07.Beego商城
  • 08.GIN框架
  • 09.GIN论坛
  • 10.微服务
  • 01.Python基础
  • 02.Python模块
  • 03.Django
  • 04.Flask
  • 05.SYL
  • 06.Celery
  • 10.微服务
  • 01.Java基础
  • 02.面向对象
  • 03.Java进阶
  • 04.Web基础
  • 05.Spring框架
  • 100.微服务
  • 数据结构
  • 算法基础
  • 算法题分类
  • 前置知识
  • PyTorch
  • Langchain
  • Linux基础
  • Linux高级
  • Nginx
  • KeepAlive
  • ansible
  • zabbix
  • Shell
  • Linux内核
  • Python

  • GO

  • Java

  • 业务问题

  • 关键技术

    • 01.接口幂等
    • 02.支付中分布式事务
    • 03.限流
    • 04.断点续传
      • 01.断点续传
        • 1、断点续传方案设计
        • 1)需求分析
        • 2)设计要点
        • 3)关键流程设计
        • 2、 断点续传的技术实现
        • 1)前端实现
        • 2)后端实现
        • 3)并发与分布式问题
        • 4)安全性与优化
    • 05.连接池设计
  • 项目常识

  • 计算机基础

  • 区块链

  • 常识
  • 关键技术
xiaonaiqiang
2024-09-24
目录

04.断点续传

文件分块:将文件分为小块,中断后仅重传未完成块

状态记录:记录已传输块信息,支持断点恢复

唯一标识:为每个上传会话分配唯一ID,确保准确识别

进度管理:前后端监控传输进度

超时重试:设置超时机制,支持中断后重试

# 01.断点续传

  • 断点续传 方案设计通常用于在数据传输过程中发生中断时,不必重新从头开始,而是从断点继续传输
  • 这种方案广泛应用于大文件上传、下载或网络不稳定场景下的数据传输

# 1、断点续传方案设计

  • 断点续传方案设计通过文件分块、状态跟踪、进度管理等技术实现
  • 可以有效解决大文件传输中的中断问题,提升传输效率和用户体验
  • 实现过程中需注意分布式存储、一致性校验以及安全性等问题,确保系统的稳定性和可靠性

# 1)需求分析

  • 大文件传输:例如,用户上传大文件时,由于网络波动或连接超时,传输可能中断,需要从断点处继续
  • 网络不稳定:断点续传可以减少因网络中断导致的重复数据传输,提升用户体验和系统效率
  • 失败重试:系统设计时要支持多次重试,以确保文件最终可以完整传输

# 2)设计要点

  • 文件分块(Chunking):将大文件分为多个小块,确保在传输中断时只需重新传输未完成的块
  • 状态记录(State Tracking):记录已经成功传输的文件块位置及相关信息,以便中断后继续传输
  • 唯一标识(Unique Identifier):给每个上传会话一个唯一的标识符(如文件ID),以便服务器和客户端在断点续传时可以准确识别
  • 上传进度管理:前端和后端都需要支持对文件传输进度的监控和管理
  • 超时和重试机制:设置合理的超时时间,并支持在中断后进行重试

# 3)关键流程设计

  • 1)文件分块

    • 客户端将大文件分为多个小块(如5MB、10MB等),每个块编号并携带该块的起始位置和大小
  • 2)上传块请求

    • 客户端发起上传请求,携带文件块编号、数据及相关标识(如文件ID)

    • 服务器接收到请求后,将每个块保存,并记录当前进度和已上传的块

  • 3)上传进度确认:

    • 客户端可根据服务器返回的响应确认已成功上传的块,并记录已完成的进度
  • 4)断点续传

    • 上传中断后,客户端重新发起上传请求,携带文件ID,请求服务器返回已上传的块

    • 服务器返回当前已上传的块信息,客户端只需上传未完成的块

  • 5)上传完成:

    • 当所有块上传完成,服务器将所有块拼接成完整文件,并返回成功响应

# 2、 断点续传的技术实现

# 1)前端实现

  • 文件分块上传:

    • 前端可以使用File和Blob API读取文件并分块,或者使用类似FileReader的方式来读取指定范围的字节
    • 通过XMLHttpRequest或fetch API发起HTTP POST请求,将文件块上传至服务器
    function uploadFileInChunks(file, chunkSize) {
        let totalChunks = Math.ceil(file.size / chunkSize);
        for (let i = 0; i < totalChunks; i++) {
            let start = i * chunkSize;
            let end = Math.min(start + chunkSize, file.size);
            let chunk = file.slice(start, end);
            
            // 发起分块上传请求
            uploadChunk(chunk, i, file.name);
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

# 2)后端实现

  • 分块上传接口:

    • 服务器应提供一个支持分块上传的接口,接受客户端上传的文件块
    • 接收的文件块应保存至临时存储位置,或直接存入数据库、分布式文件系统(如S3、HDFS等)
    from flask import Flask, request
    app = Flask(__name__)
    
    @app.route('/upload', methods=['POST'])
    def upload_chunk():
        file_id = request.form['file_id']
        chunk_index = int(request.form['chunk_index'])
        chunk = request.files['file_chunk']
        # 保存文件块逻辑
        save_chunk(file_id, chunk_index, chunk)
        return 'Chunk uploaded successfully'
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  • 状态记录:

    • 可以使用数据库(如MySQL、Redis等)存储上传状态
    • 每个文件块的上传信息(块编号、文件ID、状态等)都需要持久化保存
    def save_chunk(file_id, chunk_index, chunk_data):
        # 将块保存到磁盘或数据库
        path = f'/upload/{file_id}/{chunk_index}'
        with open(path, 'wb') as f:
            f.write(chunk_data)
        # 更新上传进度信息到数据库
        update_chunk_status(file_id, chunk_index, 'uploaded')
    
    1
    2
    3
    4
    5
    6
    7
  • 断点续传恢复:

    • 当客户端请求断点续传时,服务器可以通过文件ID查询数据库中已上传的文件块,返回给客户端继续传输未完成的部分
    @app.route('/resume', methods=['GET'])
    def resume_upload():
        file_id = request.args.get('file_id')
        uploaded_chunks = get_uploaded_chunks(file_id)  # 从数据库获取已上传的块信息
        return {'uploaded_chunks': uploaded_chunks}
    
    1
    2
    3
    4
    5

# 3)并发与分布式问题

  • 并发控制:
    • 对于并发上传多个文件块的情况,可以在后端进行并发限制,例如控制同一文件的最大并发块数
  • 分布式系统支持
    • 在分布式环境下,可以使用对象存储服务(如AWS S3),S3等对象存储服务自带分块上传和断点续传功能,通过API调用即可实现
    • 对于自建分布式系统,需确保文件块的存储分布和上传状态的一致性,建议使用分布式数据库(Redis)来存储文件块状态

# 4)安全性与优化

  • 数据完整性校验:每个文件块上传时可以使用MD5或其他哈希算法进行校验,确保数据传输的完整性
  • 断点信息加密:为防止断点续传过程中敏感信息泄露,可以对传输的文件ID和块信息进行加密
  • 上传进度缓存:上传状态可以使用缓存系统(如Redis)存储,减少数据库的读取压力
上次更新: 2025/2/19 16:42:39
03.限流
05.连接池设计

← 03.限流 05.连接池设计→

最近更新
01
05.快递Agent智能体
06-04
02
200.AI Agent核心概念
06-04
03
105.Agent智能体梳理
06-04
更多文章>
Theme by Vdoing | Copyright © 2019-2025 逍遥子 技术博客 京ICP备2021005373号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式