惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
S
Security @ Cisco Blogs
S
Secure Thoughts
Attack and Defense Labs
Attack and Defense Labs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Hacker News: Front Page
博客园 - 叶小钗
H
Heimdal Security Blog
Microsoft Security Blog
Microsoft Security Blog
Forbes - Security
Forbes - Security
AI
AI
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Troy Hunt's Blog
罗磊的独立博客
Application and Cybersecurity Blog
Application and Cybersecurity Blog
爱范儿
爱范儿
GbyAI
GbyAI
The Last Watchdog
The Last Watchdog
TaoSecurity Blog
TaoSecurity Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
D
DataBreaches.Net
Recent Announcements
Recent Announcements
Schneier on Security
Schneier on Security
C
Cisco Blogs
美团技术团队
D
Docker
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
月光博客
月光博客
雷峰网
雷峰网
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
H
Hackread – Cybersecurity News, Data Breaches, AI and More
A
Arctic Wolf
B
Blog RSS Feed
Cisco Talos Blog
Cisco Talos Blog
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
V2EX - 技术
V2EX - 技术
Y
Y Combinator Blog
N
News and Events Feed by Topic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
W
WeLiveSecurity
Security Archives - TechRepublic
Security Archives - TechRepublic
G
GRAHAM CLULEY
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
The Hacker News
The Hacker News

博客园 - 幸福的菜菜

windows下使用ACME申请SSL证书的办法 ElementPlus Radio 实现双击取消选择的效果 Windows10 LTSC版本 无法访问网络中部分的共享文件夹 SqlSugar : date绑定到XX失败,可以试着换一个类型,或者使用ORM自定义类型实现 VisualStudio Debug模式突然变慢 Visual Stadio 编译提示 The BaseOutputPath/OutputPath property is not set for project ... winform绘图与前端canvas绘图效率对比 node-sass编译不通过, 提示 “checking for Python executable "python2" in the PATH” c# async await的使用方式及为啥要用它 winform 实现对usb热拔插的监听 Laravel The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths Wampserver 配置端口可访问服务 git credential for windows 总是弹出的问题 如何用B表的数据,更新A表的值 WampServer部署https 服务的过程 PHP 命名空间冲突解决方式 Windows下 Docker 简单部署 Django应用 C#实现后台格式化U盘的功能 WAMPServer ServerName has syntax error 的问题(阿里云服务器上)
Winform 实现断点续传的思路及代码
幸福的菜菜 · 2018-08-27 · via 博客园 - 幸福的菜菜

开篇的絮絮叨叨:
如果是web,可以考虑使用 使用Web Uploader : http://fex.baidu.com/webuploader/getting-started.html

工作中需要使用到断点续传,找了好多篇博客,最后的时候在csdn上找到一个项目(文末有链接)。把他的代码拆出来使用了。

虽然不同的断点续传实现可能不同,不过思路应该都是相似的。

思路篇:

1.数据块

假设一个文件有2G大小,甚至更大,那么我们就需要把他切分成很多片断了。而断的片断,只能使用二进制的方式去切,这里是唯一的。

使用了二进制去切片,那么传输的时候,也只能使用二进制,那么无论任何语言去实现都需要支持 二进制的提交(post)

如果只是提交了数据流上去,而服务端没有任何标识信息。服务端也不会知道如何才能把碎片组合成上传的文件。

所以我们需要有文件的唯一标识(Id),文件块的位置(chunk),标识块的完整码(md5)

如果我们将所有的数据块都传完整了。那么服务端并不知道,我们有没有传完,所以需要客户端发起一次合并文件的 请求,将所有文件合并

  至此,我们已经把问题拆分的粒度比较小了。

  客户端:一个循环,不断向服务端提交文件片断及附属信息。提交完成后,发起合并请求。

  服务端:两个接口,接口文件片断及附属请求;合并文件流,组合文件

2.记录方式

 因为可能存在各种各样的原因,导致程序退出。所以下次重传的时候,需要记录程序传输的起始位置。所以这里最好能有数据库之类的来记录

sqlite是一个小型的数据库,非常方便。只不过并发性不是特别好。

实现篇:

具体的客户端的代码,我先帖到这里。

自己的winform实现

https://gitee.com/everydaygift/WinFormUploader.git

其中用了一些第三方的组件:

  easyLiter(Sqlite用来记录上传过的片断)

  log4net用来记录程序的运行状况,打日志方便调试

  csdn的源项目,具体地址:https://download.csdn.net/download/lijiangchxp2005/2585179

winform的效果如下:

 服务端的代码有一份Python和一份C#的,整理后再发出来。

扩展篇:

程序目前还有两点做的不好的:

1.可以考虑实现多线程上传。

  这里因为考虑到sqlite并发性问题,及多线程复杂的情况。目前时间还没有做

2.上传后,服务端返回状态码的判断问题

  因为目前只要是上传没有报错,那么就默认上传成功了。而实际上传片断时,可能会存在各种各样的情况,这里还需要调整。