zoukankan      html  css  js  c++  java
  • Winform 实现断点续传的思路及代码

    开篇的絮絮叨叨:
    如果是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.上传后,服务端返回状态码的判断问题

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

  • 相关阅读:
    64位操作系统安装32位客户端和PL/SQL
    Oracle clob 操作
    Oracle中DBMS_LOB包使用小结
    PLSQL自动断开服务器连接 (转)
    oracle odbc 驱动安装(不安装oracle客户端)
    Broadcom GNSS xxx Geolocaltion Sensor与Windows导航程序的兼容性(转)
    GPS经纬度的表示方法及换算
    odp.net 读写oracle blob字段
    oracle 的数组(转)
    javascript的window.ActiveXObject对象,区别浏览器的方法
  • 原文地址:https://www.cnblogs.com/everydaygift/p/9543417.html
Copyright © 2011-2022 走看看