应用Response.Write实现带有进度条的多文件上传

 本教程来学习asp.net利用RESPONSE.WRITE的这个特性实现上传文件时实时进度的显示,本文的学习重点是asp.net页面的生命周期中前后台的交互。

 
 

前几天,写过一篇随笔“使用RESPONSE.WRITE实现在页面的生命周期中前后台的交互”。说是交互,实际上也主要是在ASP.NET的页面周期中从后台利用RESPONSE.WRITE向前台即时的推送内容。

该篇随笔算是对上一篇文章的实际应用,利用RESPONSE.WRITE的这个特性实现上传文件时实时进度的显示。如对RESPONSE.WRITE/RESPONSE.FLUSH不甚了解,可以先百度一下。

提前声明一点,HTML发展到5,使用web API及jQuery upload插件能很好的实现很炫的上传进度条效果。但该随笔只针对那些不能支持HTML5

的浏览器,如IE8及以下,而又不想借助于Flash等来实现的场景。你也可以说今天要描述的方法有些过时了。至于HTML5下实现的方法,本人

近期有时间会另写一篇随笔。

言归正传。

我们要实现的页面的基本布局是这样的。

 

上传开始,便显示每文件的实时进度。如下图。

 

上传结束后,再次恢复页面基本布局。

在HTML5之前,通过web file控件上传的文件只有同步post到server端才可以被识别和读取。在此之前,client端是无法知晓文件内容的。所

以,文件上传的真实状态只能从后台传递到前端显示,这时,我们就要借助RESPONSE.WRITE了。

首先,在文件真正的被server端读取之前,要根据上传的情况向前端绘制初始进度(0%)。其次,在读取的过程中,周期性向前端推送进度

情况。主流程如下。

 

上传文件的初始进度

Request.Files携带着文件内容到达了server端,在开始读取之前,通过RESPONSE.WRITE向页面绘制初始状态。

public void CreateProgress(HttpFileCollection fileCollection)
    {
        StringBuilder sbProgress = new StringBuilder();
        sbProgress.Append("<html><head></head>  <body>");       //构造输出内容
        sbProgress.Append("<script src='FilesUpload.js' type='text/javascript'></script><table id='mainTable' border='0'>");
        for (int i = 0; i < fileCollection.Count; i++)
        {
            string strProgressBarId = "progressBar" + i;
            string strPercentageId = "percentage" + i;
            string fileName = fileCollection[i].FileName;
            sbProgress.Append("<tr><td>");
            sbProgress.Append("<p style = 'float:left; margin-left:0px; margin-right:10px;'>" + fileName + "</p>");
            sbProgress.Append("<div style='background-color:White; width: 100px;height:12px; border-color:Black;border-width:thin;border-style:solid;float:left; margin-left:0px; margin-right:10px'>");
            sbProgress.Append("<div style='background-color:Green;height:12px;' id='" + strProgressBarId + "' ></div></div>");
            sbProgress.Append("<p float:left; margin-left:0px; margin-right:10px;'><div id='" + strPercentageId + "'></div></p>");
            sbProgress.Append("</td></tr>");
        }
        sbProgress.Append("</table>");
        for (int i = 0; i < fileCollection.Count; i++)
        {
            sbProgress.Append("<script type='text/javascript'> SetProgressBarProgressAmount(" + i + ",0 );</script>");
        }
        sbProgress.Append("</body></html>");

        HttpContext.Current.Response.Write(sbProgress.ToString());
        HttpContext.Current.Response.Flush();       //强制输出内容
    }

 

文件进度更新

从上面的代码段可以看出,设置上传进度值是通过调用js方法SetProgressBarProgressAmount来实现的。在文件的读取过程中,实时的进度

也通过该方法更新到前端。

public static void setProgressBar(int id, string progressAmount)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("<body><script type='text/javascript'>SetProgressBarProgressAmount(" + id + ",'" + progressAmount + "'); </script></body>");

        HttpContext.Current.Response.Write(sb.ToString());
        HttpContext.Current.Response.Flush();
    }

 

更新进度方法是每读取完一定大小的文件内容后执行一次。

调用进度更新

 

while ((tripDownloadSize = stream.Read(b, 0, bufferSize)) > 0)
    {
        fs.Write(b, 0, tripDownloadSize);
        totalDownloadedSize += tripDownloadSize;
        Percentage = (int)(totalDownloadedSize * 100) / totalUploadSize;
        setProgressBar(id, Percentage.ToString());      //更新进度
        System.Threading.Thread.Sleep(100);
    }

最后,还有一点需要说明一下。我们把包含web file控件的区域放到一个新的页面里,并通过Iframe引用。这样做是为避免每次都post整个页面。

好了,本篇完结。

时间: 2025-01-19 03:18:32

应用Response.Write实现带有进度条的多文件上传的相关文章

改进文件上传的进度条,实时反映上传情况

上传 asp中使用组件上传时,有点麻烦就是不知道上传进度是多少,虽然有的提供了上传进度条,例如abcupload(下载地址:http://www.websupergoo.com)已经提供了显示当前上传状态的方法,里面就有专门的实例(在安装目录的Examples下面的progressupload.htm),它是提交数据的同时弹出一个反映进度的页面(progressbar.asp),然后通过这个页面自刷新来每隔一点时间获取当时的上传状态,然后把它们显示出来,但是用页面自刷新的方法效率比较低,不不好调

DJANGO和UIKIT结合,作一个有进度条的无刷新上传功能

以前作的上传,在糙了,所以在用户体验上改进一下. 同时,结合DJANGO作定位上传. 这其中分两步进行,第一次上传到TMP目录下, 第二次,将TMP下的文件转移到标准目录下. form.py file_path = forms.CharField( required=True, label=u"上传文件", widget=forms.TextInput( attrs={ 'rows': 2, 'class': 'uk-width-1-2', } ), ) upload.html {#

基于Ajax技术实现文件上传带进度条_AJAX相关

1.概述 在实际的Web应该开发或网站开发过程中,经常需要实现文件上传的功能.在文件上传过程中,经常需要用户进行长时间的等待,为了让用户及时了解上传进度,可以在上传文件的同时,显示文件的上传进度条.运行本实例,如图1所示,访问文件上传页面,单击"浏览"按钮选择要上传的文件,注意文件不能超过50MB,否则系统将给出错误提示.选择完要上传的文件后,单击"提交"按钮,将会上传文件并显示上传进度. 2.技术要点 主要是应用开源的Common-FileUpload组件来实现分

HTML5 Ajax文件上传进度条如何显示_AJAX相关

原本打算使用jquery插件进行异步文件上传,比如uploadfy但是需要额外的支持,也有人用iframe模仿异步上传机制,感觉都比较别扭.因为项目不考虑低版本浏览器,所以决定用html5实现.下面只是一个简单的demo,具体样式需要自己去做. 后台基于strut2进行文件处理,具体因项目而定.只是要注意设置文件大小的限制.  <constant name="struts.multipart.maxSize" value="52428800"/>这个配置

php ajax实现文件上传进度条_php技巧

本实例是关于php文件上传时进度条的实现,主要采用ajax技术,另外还运用了html5,有需要的朋友可以研究一下. 本实例有两个文件: upload_form.html: <!DOCTYPE html> <html> <head> <script> function _(el){ return document.getElementById(el); } function uploadFile(){ var file = _("file1"

PHP中使用Session配合Javascript实现文件上传进度条功能_php技巧

Web应用中常需要提供文件上传的功能.典型的场景包括用户头像上传.相册图片上传等.当需要上传的文件比较大的时候,提供一个显示上传进度的进度条就很有必要了. 在PHP 5.4以前,实现这样的进度条并不容易,主要有三种方法: 1.使用Flash, Java, ActiveX 2.使用PHP的APC扩展 3.使用HTML5的File API 第一种方法依赖第三方的浏览器插件,通用性不足,且易带来安全隐患.不过由于Flash的使用比较广泛,因此还是有很多网站使用Flash作为解决方案. 第二种方法的不足

PHP Session和Javascript实现文件上传进度条

在PHP 5.4以前,实现这样的进度条并不容易,主要有三种方法: 1.使用Flash, Java, ActiveX 2.使用PHP的APC扩展 3.使用HTML5的File API 第一种方法依赖第三方的浏览器插件,通用性不足,且易带来安全隐患.不过由于Flash的使用比较广泛,因此还是有很多网站使用Flash作为解决方案. 第二种方法的不足在于,它需要安装PHP的APC扩展库,要求用户能够控制服务器端的配置.另外,如果安装APC仅仅是为了实现一个上传进度条,那么显然有点杀鸡用牛刀的意思. 第三

jQuery监听文件上传实现进度条效果的方法_jquery

原理: 给XMLHttpRequest对象的upload属性绑定onprogress方法监听上传过程 var xhr=new XMLHttpRequest(); xhr.upload.onprogress=function(e){} 因为jQuery默认使用的XMLHttpRequest对象是内部生成的无法直接给jq的xhr绑定onprogress方法 所以只要给jQuery重新生成一个绑定了onprogress的XMLHttpRequest对象即可实现 首先封装一个方法 传入一个监听函数 返回

jQuery实现简单的文件上传进度条效果_jquery

本文实例讲述了jQuery实现文件上传进度条效果的代码.分享给大家供大家参考.具体如下: 运行效果截图如下: 具体代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>upload</title> <link rel="stylesheet" type="text/css" href=&quo