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

推荐订阅源

V
Vulnerabilities – Threatpost
aimingoo的专栏
aimingoo的专栏
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
Engineering at Meta
Engineering at Meta
IT之家
IT之家
V
Visual Studio Blog
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
A
About on SuperTechFans
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
N
News and Events Feed by Topic
A
Arctic Wolf
WordPress大学
WordPress大学
小众软件
小众软件
C
CERT Recently Published Vulnerability Notes
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Fortinet All Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Y
Y Combinator Blog
T
Threat Research - Cisco Blogs
Latest news
Latest news
Simon Willison's Weblog
Simon Willison's Weblog
Cyberwarzone
Cyberwarzone
S
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
Stack Overflow Blog
Stack Overflow Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
J
Java Code Geeks
Spread Privacy
Spread Privacy
宝玉的分享
宝玉的分享
I
Intezer
L
LangChain Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
G
GRAHAM CLULEY
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
Attack and Defense Labs
Attack and Defense Labs
Security Archives - TechRepublic
Security Archives - TechRepublic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客园 - peace

MYSQL分页存储过程及事务处理 审批流设计方案的探究 WEB项目(B/S系统)打包安装(总结篇) 再次分享一个多选文件上传方案 SQL SERVER里的赋值机制闲聊 FLEX4.0开发流媒体视频播放器(总结篇) 告别ADO.NET实现应用系统无缝切换的烦恼(总结篇) SQL SERVER行转列应用小结 SQL SERVER函数——表值函数的处理 纠正网上流传的SQL取某一时间的当月第一天和最后一天的时间写法 SQL SERVER游标操作 告别.NET生成报表统计图的烦恼 发现联想手机P630型号的一个严重的系统Bug thinkpad T400型号安装server2003系统驱动共享 分享一个.NET版的多选文件上传操作示例 一个简单的httpModule应用 JS给页面标签添加事件(或超链接链接) 让默认焦点的按钮无虚框(又来无聊了) 利用ASP.NET日期控件制作“会议日程安排”(贴首页过把瘾)
文件上传之断点续传方案
peace · 2011-04-06 · via 博客园 - peace

   和前一篇一样,还是文件上传,这篇主要是文件的断点续传,因为项目中的实际应用情况,需要系统支持断点续传,很多时候用户上传比较大的图档文件往往一个压缩包的文件就达到了一个多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兄弟。