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

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

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

  先附上示例代码MultiUploadProgressClassic

  提前声明一点,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向页面绘制初始状态。

 1     public void CreateProgress(HttpFileCollection fileCollection)
 2     {
 3         StringBuilder sbProgress = new StringBuilder();
 4         sbProgress.Append("<html><head></head>  <body>");       //构造输出内容
 5         sbProgress.Append("<script src=‘FilesUpload.js‘ type=‘text/javascript‘></script><table id=‘mainTable‘ border=‘0‘>");
 6         for (int i = 0; i < fileCollection.Count; i++)
 7         {
 8             string strProgressBarId = "progressBar" + i;
 9             string strPercentageId = "percentage" + i;
10             string fileName = fileCollection[i].FileName;
11             sbProgress.Append("<tr><td>");
12             sbProgress.Append("<p style = ‘float:left; margin-left:0px; margin-right:10px;‘>" + fileName + "</p>");
13             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‘>");
14             sbProgress.Append("<div style=‘background-color:Green;height:12px;‘ id=‘" + strProgressBarId + "‘ ></div></div>");
15             sbProgress.Append("<p float:left; margin-left:0px; margin-right:10px;‘><div id=‘" + strPercentageId + "‘></div></p>");
16             sbProgress.Append("</td></tr>");
17         }
18         sbProgress.Append("</table>");
19         for (int i = 0; i < fileCollection.Count; i++)
20         {
21             sbProgress.Append("<script type=‘text/javascript‘> SetProgressBarProgressAmount(" + i + ",0 );</script>");
22         }
23         sbProgress.Append("</body></html>");
24
25         HttpContext.Current.Response.Write(sbProgress.ToString());
26         HttpContext.Current.Response.Flush();       //强制输出内容
27     }

初始进度绘制

文件进度更新

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

1     public static void setProgressBar(int id, string progressAmount)
2     {
3         StringBuilder sb = new StringBuilder();
4         sb.Append("<body><script type=‘text/javascript‘>SetProgressBarProgressAmount(" + id + ",‘" + progressAmount + "‘); </script></body>");
5
6         HttpContext.Current.Response.Write(sb.ToString());
7         HttpContext.Current.Response.Flush();
8     }

实时进度更新

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

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

调用进度更新

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

  好了,本篇完结。

时间: 2024-10-27 11:28:26

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

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 {#

基于HT for Web矢量实现HTML5文件上传进度条

在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件上传进度条,矢量在<矢量Chart图表嵌入HTML5网络拓扑图的应用>一文中已经讲述了关于setCompType()方法的应用,今天我们用setImage()方法充分利用系统中定义好的矢量资源来实现文件上传进度条,我们先来看下效果图: 从效果图可以看到,向服务器上传了一个mp4文件,并在最下方显示

struts2实现文件上传进度条(前端JS+Java)(自我整理)

需要做一个文件上传进度的效果,结合网上资料和自己的实践后,这里做一个整理 步骤如下: 1.重写.自定义JakartaMultiPartRequest类 <span style="font-size:12px;">package com.hikvision.fileUploadProcess.interceptor; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import

atitit. 文件上传带进度条 atiUP 设计 java c# php

atitit. 文件上传带进度条 atiUP 设计 java c# php 1. 设计要求 1 2. 原理and 架构 1 3. ui 2 4. spring mvc 2 5. springMVC.xml 3 6. struts extand url 3 7. behide code 3 8. 简化设计 3 1. 设计要求 带进度条 完成提示动画效果.. 2. 原理and 架构 如果需要显示进度条,实时显示文件上传进度 需要使用Ajaxj技术..up到个在的iframe黑头.. 工作原理 其实际

atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7

1. 实现原理 1 2. 大的文件上传原理::使用applet 1 3. 新的bp 2 1. 性能提升---分割小文件上传,避免一次使用内存使用过大的 2 2. Uuid还是原来文件名称:: 2 3. 监听器频繁地被调用 2 4. 结合wz easyui 2 4. 选型 2 5. Uploadify::yash js+flash 3 6. commons-fileupload:: 3 7. COS这个工具O'Reilly公司 3 8. 大的文件上传组件总结 3 5. 林吧实现ui Ajax+jq

关于文件上传下载以及其他进度条的实现

现在我的上传,下载,或者某个批量的进度的进度条实现思路都是这样: 定义一自定义类,列出总数量,完成数(有需求决定可分成功与失败) 然后访问链接的时候进行处理,将session中存入自定义类,自定义类中存入初始化信息.并执行操作 访问链接时异步进行ajax获取当前进度,得到session中自定义类,定时器ajax达到实时更新进度的效果. 文件上传使用了commons-fileupload的一个监听组件,在监听方法中可以得到upload的成功size 文件写入缓存的话这个模式感觉可以,下载的进度条思

jQuery.uploadify-----文件上传带进度条,支持多文件上传的插件

借鉴别人总结的uploadify:基于jquery的文件上传插件,支持ajax无刷新上传,多个文件同时上传,上传进行进度显示,控制文件上传大小,删除已上传文件. uploadify有两个版本,一个用flash,一个是html5.html5的需要付费~所以这里只说flash版本的用法. uploadify官网地址:http://www.uploadify.com/ 上传文件截图: uploadify文档:http://www.uploadify.com/documentation/,在这儿可以查看

Retrofit2文件上传下载及其进度显示

序 前面一篇文章介绍了Retrofit2的基本使用,这篇文章接着介绍使用Retrofit2实现文件上传和文件下载,以及上传下载过程中如何实现进度的显示. 文件上传 定义接口 1 2 3 @Multipart @POST("fileService") Call<User> uploadFile(@Part MultipartBody.Part file); 构造请求体上传 1 2 3 4 5 File file = new File(filePath); RequestBod

Uploadify上传,可以上传多个文件,带有进度条,希望有所帮助!

原文:Uploadify上传,可以上传多个文件,带有进度条,希望有所帮助! 源代码下载:http://www.zuidaima.com/share/1550463502568448.htm 上传前 上传后