[翻译]ASP.NET(C#) 中的文件上传进度条

翻译 2004年10月15日 14:26:00

作者:azamsharp
翻译:sharpcn

介绍:
几天前,我在论坛上看到一个“如何创建文件上传进度条”的问题。大家知道,我们有上传客户端文件到服务器端的控件,但是这个控件并不提供任何关于上传进度的信息。如果客户端上传文件(尤其是大文件),而页面上没有任何变化,就不容易知道上传操作是否在进行,有多少还没有传完。解决方案就是使用一些技术方法在客户端显示上传进度。
背景知识:
在这篇文章中,我并不主讲“如何将文件上传到服务器端”。向大家推荐Konstantin Vasserman的一篇精彩文章:“用ASP.NET上传文件”。
我想说几句关于服务器上传的知识。如果客户端不向服务器端提交资源请求,服务器端将不向客户端发送任何信息,所以向客户端发送文件上传的进度消息是不可能的。为了解决这个问题,我们必须让客户端向服务器端发送请求。下面的这一小段Javascript代码将在2秒中之后向服务器端放松请求。
<script>
    setTimeOut(“_doPostBack('btnRefresh','')“, 2000);
</script>
在这段代码中,我使用了可以表示上传信息的【PostBack】事件,她将触发由Asp.net创建的【_doPostBack】事件。
如何做:
好了,道理是很简单的。客户端向服务器端请求上传页面,当她第一次加载的时候,显示上传的窗体页面。当点击“上传”按钮的时候,PostBack (回传)事件被发送到服务器端。服务器端代码创建一个负责文件上传并显示最终信息的进程。页面使用上面的Javascript代码每2秒钟刷新一次页面并更新上传信息。当文件上传完毕,结果就显示出来了。

要点就是读取数据包中的数据。下面是上传文件的程序。
private void uploadThread()
{
    byte[] b = new byte[1024];
    int read = 0;
    try
    {
        using (FileStream fs = new FileStream(_filename, FileMode.Create))
        {
            while ((read = _stream.Read(b, 0, b.Length)) > 0)
            {
                fs.write(b, 0, read);
                _bytesRead += read);
                System.Threading.Thread.Sleep(100);
            }
        }
    }
    catch(Exception ex)
    {
        _exception = ex;
    }
    _uploaded = true;
}

你可以看出,数据是以1024字节为单位进行加载的。每次数据包被拷贝的时候,BytesRead属性就开始更新。缓冲的越多,差别就越大(上传大文件的时候这种效果显而易见 sharpcn注。)
使用示例:
这个 FileUploadTread类已经支持数据上传了。现在要做的就是实例化这个类。
FileUploadThread fut = new FileUploadThread(Server.MapPath(“files/the_filename“), theFile.PostedFile.InputStream);
继续验证获取上传进程信息。
if (!fut.Upload)
{
    // 读取进程信息
    string info = String .Format(“{0} of {1} bytes {2} %)“,fut.BytesRead, fut.Length, fut.Persent);
}
else
{
    // 文件已经被上传
}

如需退出上传,只需 Call FileUploadThread类的 Cancel()方法。
fut.Cancel();

这里有一个狡猾的事情。就是如果用户关闭浏览器,上传仍会继续进行,直到发生超时或者上传完毕。到目前为止,我还没有找到修复这个BUG的方法。

这个示例描述了上传页所需的所有必要信息。

  • 上传窗体
  • 上传进度条
  • 上传结果

还有一个事情我想说的是,ASP.NET限制上传数据大小,如果数据大于上传最大限度值(MaxRequestLeght),请求将不被处理。最大限度值是由 web.config 或者 machine.config httpRuntime决定的。这儿有一个如何将最大限度值设置为 10MB 的例子。
<httpRuntime maxRequestLength=”10240”
                     useFullyQualifiedRedirectUrl=”true”
                     executionTimeout=”45” />

关于这方面的详细信息,请参考MSDN.

[翻译]ASP.NET(C#) 中的文件上传进度条

作者:azamsharp 翻译:sharpcn介绍:几天前,我在论坛上看到一个“如何创建文件上传进度条”的问题。大家知道,我们有上传客户端文件到服务器端的控件,但是这个控件并不提供任何关于上传进度的信...
  • cfaq
  • cfaq
  • 2005年08月09日 14:26
  • 2856

使用IHttpAsyncHandler实现带进度条的文件上传

asp.net中实现带进度显示的文件上传功能有很多选择,比如:Html5 XMLHttpRequest2、第三方控件、flash插件等等。本文介绍使用IHttpAsyncHandler对象实现进度显示...
  • taoerchun
  • taoerchun
  • 2016年04月05日 18:27
  • 1401

上传文件带真实的进度条(支持多文件上传)--进度条是在文件上传完成后再显示

ASP.NET实现进度条上传文件源码 源码说明 该程序采用了jquery框架,实现了小文件上传。 两个地方需要解释 第一,如何知道监听的这个文件就是上传的这个文件实现机制很简单,就是让asp.net产...
  • lovegonghui
  • lovegonghui
  • 2016年06月22日 11:39
  • 2442

asp.net 实现进度条 用来显示加载进度或程序处理进度

private void Page_Load(object sender, System.EventArgs e) { beginProgress(); for...
  • smartsmile2012
  • smartsmile2012
  • 2012年11月09日 16:29
  • 8791

XMLHTTPRequest实现带进度条的文件上传

通过之前的文章,我们知道XMLHTTPRequest对象是实现Ajax技术的核心,之前的博文介绍了其简单的应用,这篇文章展示通过XMLHttpRequest对象来定时监控服务器上文件上传的进度,通过进...
  • gxwzmm
  • gxwzmm
  • 2013年09月24日 21:36
  • 11589

asp.net单文件带进度条上传

asp.net单文件带进度条上传,不属于任务控件,也不是flash类型的上传,完全是asp.net、js、css实现上传。源码为开发测试版,需要使用的亲需要注意修改配置文件。...
  • qin_zhangyongheng
  • qin_zhangyongheng
  • 2015年06月28日 22:10
  • 965

C# asp.net与jquery做ajax简单进度条

一直以为response.Flush() 可以实现。。。。发现不行的 最后还是采用了全局参数保存到 cahe 来做了 setCahe.ashx 模拟操作的事件进度 public voi...
  • livelymoon
  • livelymoon
  • 2015年08月28日 11:47
  • 809

文件上传 带进度条 多种风格 非常漂亮!

友好的提示 以及上传验证!       部分代码:   form id="form1" runat="server"...
  • ysq5202121
  • ysq5202121
  • 2012年09月24日 13:37
  • 1905

实现GridView 里的进度条

 在一些项目管理系统里经常要用一个进度条去动态显示当前项目进展情况,那如何在GridView里实现进度条呢?首先要有一个百分比(如根据当前的情况和原先计划的工期计算一个项目完成的百分比),然后根据这个...
  • hakule
  • hakule
  • 2008年11月17日 21:26
  • 5221

使用Jquery开源插件实现文件上传(带进度条)

test #progress{width:90%;margin:5%;} ...
  • dong_18383219470
  • dong_18383219470
  • 2016年11月06日 22:33
  • 2103
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[翻译]ASP.NET(C#) 中的文件上传进度条
举报原因:
原因补充:

(最多只允许输入30个字)