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

推荐订阅源

C
Cisco Blogs
Schneier on Security
Schneier on Security
T
Tor Project blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
Security Latest
Security Latest
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
NISL@THU
NISL@THU
L
Lohrmann on Cybersecurity
Scott Helme
Scott Helme
Webroot Blog
Webroot Blog
Project Zero
Project Zero
Google Online Security Blog
Google Online Security Blog
The Last Watchdog
The Last Watchdog
Spread Privacy
Spread Privacy
Hacker News: Ask HN
Hacker News: Ask HN
PCI Perspectives
PCI Perspectives
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
W
WeLiveSecurity
Attack and Defense Labs
Attack and Defense Labs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
N
News | PayPal Newsroom
Help Net Security
Help Net Security
The Hacker News
The Hacker News
H
Heimdal Security Blog
O
OpenAI News
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
Cyberwarzone
Cyberwarzone
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 叶小钗
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
I
Intezer
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security Affairs
P
Proofpoint News Feed
S
Secure Thoughts
腾讯CDC
Google DeepMind News
Google DeepMind 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.上传后,服务端返回状态码的判断问题

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