文件上传之断点续传方案

简介: 原文 http://www.cnblogs.com/peaceli/archive/2011/04/06/breakpoint_upload.html 和前一篇一样,还是文件上传,这篇主要是文件的断点续传,因为项目中的实际应用情况,需要系统支持断点续传,很多时候用户上传比较大的图档文件往往 一个压缩包的文件就达到了一个多G,有时候网速慢,传到中途卡住了或断线了,又得重新传。

原文 http://www.cnblogs.com/peaceli/archive/2011/04/06/breakpoint_upload.html

和前一篇一样,还是文件上传,这篇主要是文件的断点续传,因为项目中的实际应用情况,需要系统支持断点续传,很多时候用户上传比较大的图档文件往往 一个压缩包的文件就达到了一个多G,有时候网速慢,传到中途卡住了或断线了,又得重新传。这时候让系统支持断点续传还是非常有必要的,起初原本打算用 flex+ftp实现断点续传,后来在园子里看到Jon.Hong写的一篇断点续传的文章,是用silverlight+wcf开发的,觉得更适合在项目中应用(http://www.cnblogs.com/T-MAC/archive/2008/10/20/1298179.html),非常感谢Jon.Hong兄弟。

   这里主要对Jon.Hong的那个项目做了个别地方的修改,刚开始下载无法运行,可能是SilverLight版本的原因,我安装的运行版本是

   重新做了修改才正常运行,另外对其中个别地方逻辑进行了修正,所有调整的内容如下:

      (注:红色部分为后来更新部分——更新时间2011年7月)

   一、原有系统System.Windows.Controls.FileDialogFileInfo 采用了System.IO.FileInfo代替,不然编译不通过,这点明显是版本原因。

   二、进度条无法显示问题。这点也有可能是版本问题,直接用ProgressBar代替原有继承自Jon_UI_Controls的控件后正常显示。

   三、选择文件后不刷新页面再次选择文件画布重叠问题。每次选择文件后清空上传选择文件遗留的画面即可。

    UIElement ui_old = null;

复制代码
 var dialog  =   new  System.Windows.Controls.OpenFileDialog();
            
if  (dialog.ShowDialog()  ==   true )
            {
                
if  (ui_old  !=   null )
                {
                    
this .LayoutRoot.Children.Remove(ui_old);  // 移除原有的画面
                }
                var ui 
=   new  Jon.FileUpLoad.UI.FileUpLoadTaskManager(dialog.File,  " http://localhost:9999/Service1.svc " )
                {
                    Width 
=   400 ,
                    HorizontalAlignment 
=  HorizontalAlignment.Center,
                    VerticalAlignment 
=  VerticalAlignment.Center
                };
                
this .LayoutRoot.Children.Add(ui);
                ui_old 
=  ui;
            }
复制代码

     四、点击上传后,中止按钮无效问题。这点我看了下其中的代码,好像有一个逻辑问题没处理好,原来系统中点中止时把文件流给清空了,这么一来上传是停止了同 时也会引发对象为空的异常,最重要的再次点上传上也是无法继续的,因为此时的文件流为空,无法从断点处继续上传了。为此我定义了一个中止属性,当点击中止 和上传时都会该属性赋值,在引发上传事件时对该属性进行判断即可,并不清空文件流,只有在文件上传完毕后才清空文件流。

    

复制代码
  ///   <summary>
        
///  中止文件上传
        
///   </summary>
         public   void  Abort()
        {
            FileUpLoad.IsAbort 
=   true // 中止标志
            
// this.Dispose();
        }
        
#endregion

        
#region  Protected Methods
        
///   <summary>
        
///  释放资源
        
///   </summary>
         protected   virtual   void  CloseFileStream()
        {
            
if  (fs  !=   null )
            {
                fs.Close();
                fs.Dispose();
                fs 
=   null ;
            }
        }
        
#endregion

        
#region  IDisposable Members
        
///   <summary>
        
///  释放资源
        
///   </summary>
         public   void  Dispose()
        {
            
this .CloseFileStream();
            
this .FileInfo  =   null ;
        }
复制代码

    

    五、增加了上传大小动态显示和百分比进度显示。(其实这里还可以根据已知条件计算上传速率和上传所需要的时间,都是可以实现的)

    六、增加了接收来自aspx页面传递的参数功能。因为基本上要应用到实际项目中,不可避免的要接收外部参数,silverlight接收 aspx页面的参数操作也简单,如下在silverlight页面的page_load方法里加上下面这段即可(这里假设传递的是ID和Name两个参 数)

    

复制代码
 IDictionary < String, String >  paras  =  HtmlPage.Document.QueryString;
            
if  (paras.Count  >   0 )
            {
                
if  (paras.ContainsKey( " ID " ))
                    
this .lblParam.Text  =  paras[ " ID " ];
                
if  (paras.ContainsKey( " Name " ))
                
this .lblParam.Text  +=  paras[ " Name " ];
            }
复制代码

       主要作了以上六处调整,另外如果是在发布后结合到项目中去用,有两点要注意(如果发布后运行有问题的话)

         更新补充部分调整如下:

       七、增加了数据库持久化通讯支持,主要记录是登录用户上传自己的文件,不同用户 上传同一文件时不冲突,上传完成前临时文件的命名为原始文件名+.up用户ID,示例demo是基于数据库配置的,如果要应用的项目中,数据库操作部分自 行修改即可,主要涉及两个方法的修改BeginUpLoad和CheckFileIsUpLoaded。

 

       八、增加了文件上传速率和剩余时间的效果,上传速率是每秒动态计算,比如上传文件流每次(不是每秒)读取2M,有可能每秒读取4次,那么当前的速率为 8M/S,剩余时间的计算用总的未上传的文件大小除以当前速率计算的结果,每秒的速率变化剩余时间也会相应变化。另外界面稍微调整了下颜色,美感不怎么 样,先这么凑活了:)如下图:

          

   一、系统权限问题,参考了网上的解决方法,系统盘的windows下的temp文件夹权限设置,操作如下:

    

 

    

    

    二、部署的站点属性设置。主要是对MIME类型的设置,即添加支持对silverlight运行识别的扩张类型,如下:

    

    

    运行的效果图如下:

    

    

    

    

 

    下面这张截图是接收参数和输出参数显示

    

 

    总体来说这个断点续传的功能还是相当不错的,上传时的运行效率也很高,可以设置每次(不是每秒)上传循环时读取文件流的大小,我测试设置的时每次2M,如果网速好的话就非常快了。

    详细的参考内容大家可以参考Jon.Hong的相关文件,里面的代码我这里并没有做过多详细的说明。下面是我修改后的项目源码:

   

    源码下载断点续传

         新版本源码下载:断点续传新版

   OK,两篇都是文件上传的,算是写完了,好久没上来写写什么了,有空了写写东西感觉也还好的,至少不坏,就当是消磨时间吧,分享给大家也当是相互学习了,再次感谢Jon.Hong兄弟。

目录
相关文章
|
关系型数据库 MySQL DataX
C++常见gcc编译链接错误解决方法
除非明确说明,本文内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录一下(加粗字体是关键词):用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdynamic”指定链接共享库,使用示例:-Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest("-Wl"表示是传递给链接器ld的参数,而不是编译器gcc/g++的参数。
2837 0
|
iOS开发 Swift Perl
[快速学会Swift第三方库] Eureka篇
[快速学会Swift第三方库] Eureka篇 Eureka可以帮你简单优雅的实现动态table-view表单。它由rows,sections和forms组成。如果你的app包含大量表单,Eureka可以真正帮你节省时间。 目录 快速学会Swift第三方库 Eureka篇 目录 编码之前 导入 Eureka 其他操作 创建表单 基础表单 选择类型表
3477 0
|
物联网 5G 智能硬件
物联网卡:物联网卡不支持语音通话,是如何实现设备间的数据传输和通信的?
物联网卡(IoT SIM卡)通常被设计用于支持物联网(IoT)设备之间的数据传输,而不直接支持语音通话功能。这是因为物联网设备主要关注的是数据的收集、传输和处理,而不是语音通信。为了实现设备间的数据传输和通信,物联网卡及其背后的技术采用了多种方法,主要包括但不限于以下几种方式:
物联网卡:物联网卡不支持语音通话,是如何实现设备间的数据传输和通信的?
|
机器学习/深度学习 人工智能 自然语言处理
【人工智能】人工智能就业岗位发展方向有哪些?
人工智能领域的岗位多样,涵盖了从技术研发到应用实施、从产品设计到市场运营等各个方面,以下是人工智能就业岗位的主要发展方向
1386 59
|
机器学习/深度学习 传感器 监控
深度学习在图像识别中的突破与应用
随着人工智能的飞速发展,深度学习已经成为推动图像识别技术进步的核心动力。本文旨在探讨深度学习在图像识别领域的最新突破及其广泛应用,通过分析卷积神经网络(CNN)等关键技术的发展,揭示深度学习如何革新传统图像处理方式,提升识别精度和效率。文章还将概述当前面临的挑战与未来发展趋势,为读者提供一个全面而深入的技术视角。
|
TensorFlow 算法框架/工具 计算机视觉
精通 TensorFlow 2.x 计算机视觉:第三、四部分
精通 TensorFlow 2.x 计算机视觉:第三、四部分
346 0
|
测试技术 Android开发 移动开发
SoloPi:支付宝 Android 专项测试工具 | 开源
本文主要介绍支付宝在移动端上实现的一套无线化、非侵入、免 Root 的 Android 专项测试方案 SoloPi。直接操控手机,即可实现自动化的功能、性能、兼容性、以及稳定性测试等工作。
3323 0
|
安全 数据安全/隐私保护 Android开发
通过客户端登录使用无影云桌面
通过客户端登录使用无影云桌面。
19991 5
|
存储 SQL 自然语言处理
MySQL 模糊查询再也不用like+%了
MySQL 模糊查询再也不用like+%了
MySQL 模糊查询再也不用like+%了