讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何进行大文件分片上传?(断点续传逻辑设计)

落瑶大大_8182

落瑶大大_8182

发布时间:2026-02-28 11:03:04

|

581人浏览过

|

来源于php中文网

原创

断点续传必须基于file_token+total_size+client_id三元组校验;上传前客户端计算全文件SHA256,服务端据此匹配已传分片并校验每片哈希;分片读取需用seekg与gcount严格控界;失败后须查询服务端状态再决定重传或清空重来。

c++如何进行大文件分片上传?(断点续传逻辑设计)

分片上传前必须校验文件是否被修改

大文件上传中途失败再续传,最怕用户在暂停后偷偷改了文件内容。MD5 或 SHA256 校验不是可选项,是断点续传成立的前提。只比对文件名或大小,upload_id 会失效,服务端根本不敢信任已传的分片。

  • 客户端上传前先计算整个文件的 sha256sum(用内存映射 + 分块读取,避免 OOM),作为 file_token 发给服务端
  • 服务端收到首请求时,检查该 file_token 是否已有未完成上传;若有,直接返回已传分片列表,不新建任务
  • 每次上传分片时,客户端必须附带该 file_token 和当前分片的偏移量 offset、长度 size,服务端按此定位并校验分片哈希(如 SHA256(file[offset:offset+size]))

用 std::ifstream 配合 seekg 安全读取分片

C++ 没有现成的“分片流”抽象,得自己控制读取边界。直接用 read() 不设限容易越界,尤其文件被截断或并发修改时,gcount() 返回值必须校验。

  • 打开文件用 std::ios::binary 模式,否则 Windows 下换行符会被误转
  • 每次分片上传前调用 ifs.seekg(offset, std::ios::beg),之后立即检查 ifs.fail() —— 若 offset 超出当前文件大小,seekg 会静默失败
  • 用 ifs.read(buffer, chunk_size) 后,立刻用 ifs.gcount() 获取真实读取字节数,它可能小于 chunk_size(比如最后一片),不能直接当完整分片发出去

服务端如何判断“同一文件”的续传请求

光靠前端传来的 file_name 或 upload_id 不可靠:重名文件、浏览器缓存旧 ID、用户刷新页面都会导致歧义。真正能锚定上传会话的是三元组:file_token + total_size + 客户端生成的稳定 client_id(如 UUIDv4)。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • file_token 保证内容一致;total_size 排除截断/追加干扰;client_id 防止不同设备用同一文件 token 冲突
  • 服务端存储分片元数据时,主键应为 (file_token, client_id, chunk_index),而非 upload_id —— 后者应在首次请求时由服务端生成并返回,仅供前端临时引用
  • 若收到新请求的 file_token 已存在但 total_size 不同,直接拒绝,返回错误 "file_size_mismatch"

断点续传失败时,客户端怎么安全回退

网络中断、磁盘满、权限丢失都可能导致单个分片上传失败。此时不能简单重试,更不能删掉已传分片——得让服务端和客户端状态严格对齐。

立即学习“C++免费学习笔记(深入)”;

  • 客户端每次上传分片后,必须等待服务端明确返回 {"status":"success","chunk_index":5} 才算落库成功;超时或 HTTP 非 2xx 一律视为失败
  • 失败后,客户端立即发起 GET /upload/status?file_token=xxx&client_id=yyy 查询当前服务端已确认的分片列表,而不是依赖本地缓存
  • 若服务端返回的已传列表为空或不连续,说明元数据损坏,客户端应触发完整重传流程(清空本地记录,从 index 0 开始),而不是盲目跳过“看起来已传”的分片

最难缠的其实是时钟不同步导致的 last_modified 时间戳错乱,或者 NFS 文件系统下 stat() 返回陈旧 size —— 这些地方没法靠逻辑兜住,只能靠 file_token 强一致性来覆盖。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

12746

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

1545

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

3457

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

5601

2024.03.01

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3099

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2678

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

1448

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2439

2023.08.02

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn