CSDN博客

img sharpcn

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

发表于2004/10/15 14:26:00  3653人阅读

分类: ASP.NET Reading Notes Translate

作者: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.

阅读全文
0 0

相关文章推荐

img
取 消
img