0

0

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

尼克

尼克

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

|

521人浏览过

|

来源于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_nameupload_id 不可靠:重名文件、浏览器缓存旧 ID、用户刷新页面都会导致歧义。真正能锚定上传会话的是三元组:file_token + total_size + 客户端生成的稳定 client_id(如 UUIDv4)。

Timely
Timely

一款AI时间跟踪管理工具!

下载
  • 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工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

6483

2023.09.14

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

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

838

2023.09.14

token怎么获取
token怎么获取

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

1087

2023.12.21

token什么意思
token什么意思

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

1768

2024.03.01

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

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

1314

2023.07.26

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

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

1156

2023.07.27

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

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

825

2023.08.01

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

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

460

2023.08.02

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

0

2026.02.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.3万人学习

C 教程
C 教程

共75课时 | 5万人学习

C++教程
C++教程

共115课时 | 19.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号