如图。
先谢谢各位啦!
先谢谢各位啦!
解决方案 »
- 本人是asp.net的初学者,谁能给我一个类似于asp中表单提交并在另一页显示的一个小例子,谢谢
- 奇怪,为何不能给RadioButtonList赋值啊??
- 一个郁闷的中文输出问题-请教?
- 求解 VS2008安装错误
- help
- 郁闷中,仍然是textchanged的问题~~~~请高手进来解决一下,多谢多谢~~
- strFileName="attachment;filename=测试.gif"; 如何才能支持汉字
- webBrowser这个控件走形是怎么回事
- 检索 COM 类工厂中 CLSID 为 {******} 的组件失败
- 关于函数调用问题
- 母版页
- ReportViewer无法显示全部列!搞了半天没搞好!帮帮
一般情况下,要实现上传进度条首先要实现上传文件分块读取,而默认情况下,iis将直接把上传的文件一次读入到内存中,所以本处的难点在于拦截iis的文件上传过程,转而自己的实现方式。所以,我们可以实现一个IHttpModule来处理上传过程。具体的过程是Application_BeginRequest下得到当前的HttpWorkRequest,然后通过这个对象来得到当前请求的类型,长度。具体方法请查看类的实现代码(该类来自于互联网)。由于在类中已经有比较完整的注释,所以我只介绍一个流程,没有涉及到具体的方法。
我们可以知道,如果我们取得了总的长度,那我们就可以设置一个固定的长度(比如1024字节),然后设置一个循环来每次读取这些数据,这样,我们就可以得到当前总共读取的内容长度。那页面上如何得到当前的进度呢?利用appliaction对象来存储数据,这样,前台的页面也可以使用application来得到当前的进度。因为application要使用一个键来确定是哪次的数据,常用的方法是,ihttpmodule中通过request来取得这次的键值,而上传文件也同样拥有这样一个键值。因此在upload.aspx中的page_load中需要:this.UploadID = this.Request["UploadID"];
if (this.UploadID == null)
this.Response.Redirect("~/user/uploadphotos.aspx?UploadID=" + Guid.NewGuid().ToString()+
"&itemid="+this.itemid.ToString (), true);
如果第一次进入,就重新转发到这张页面,并给他一个uploadid,同时在HttpUploadModule中:string uploadId = app.Request.QueryString["UploadID"];//同步取得这个uploadid
那如何来实时读取这个数据并显示在页面中呢?我们可以在upload.aspx中使用xmlhttp去循环请求一个progress.aspx(这个页面来读取application中的数据)。当然,在asp.net中我们还可以使用asp.net ajax来实现这一过程,具体方法是:建立一个webservices来读取application中的数据;在ajax中来访问这个service;
如下webservices端代码:using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using adow.adup.bll;
namespace thmz.shire.services
{
/// <summary>
/// Uploadprogress 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class Uploadprogress : System.Web.Services.WebService
{ public Uploadprogress()
{ //如果使用设计的组件,请取消注释以下行
//InitializeComponent();
} [WebMethod]
public string HelloWorld()
{
return "Hello World";
}
[WebMethod]
public string Getprogess(string upid)
{
Progress progress = HttpUploadModule.GetProgress(upid, this.Application);
string scriptText = "";
if (progress != null)
{
if (progress.State == UploadState.ReceivingData)
{
string length = (progress.ContentLength / 1024).ToString();
string read = (progress.BytesRead / 1024).ToString();
scriptText = String.Format("{0}:{1}", length, read);
}
else if (progress.State == UploadState.Complete)
{
scriptText = "完成";
}
else
{
scriptText = "出错";
}
}
return scriptText;
} }
}
在upload.aspx中的services请求:<script language="javascript" type="text/javascript">
function startprogress()
{
getprogress('<%=UploadID %>');
}
var uploadid="";
var callindex=0;
var div_process_out=$get('div_process_out');
var div_process=$get('div_process');
function uploadit()
{
if (uploadid=="")
return;
uploadrequest= thmz.shire.services.Uploadprogress.Getprogess(uploadid,up_complete,up_error);
}
function up_complete(result)
{
var sp_result=$get("sp_result");
callindex++;
if (result!=null)
{
div_process_out.style.visibility='visible';
var valuecol=result.split(':');
if (valuecol.length>=2)
{
var length=valuecol[0];
var read=valuecol[1];
var completeblocks=parseInt(parseFloat (read)/parseFloat(length) * 100);
sp_result.innerText=completeblocks+" %";
div_process.style.width=completeblocks+"%";
}
else
{
sp_result.innerText=result;
}
}
}
function up_error(result)
{
var sp_result=$get("sp_result");
sp_result.innerText="error occurs";
}
function getprogress(upid)
{
uploadid=upid;
window.setInterval("uploadit()",400);
}
</script>
当然需要触发这个请求:<asp:Button ID="but_ok" runat="server" Text="上传" OnClientClick="startprogress()"/>
还有在webconfig中启用我们的这个httpuploadmodule<httpModules>
<!-- 分块上传模块-->
<add name="HttpUploadModule" type="adow.adup.bll.HttpUploadModule, adow.adup.bll" />
</httpModules>为了能够上传大文件,我们还需要设置:<httpRuntime
maxRequestLength="1000000"
executionTimeout="300"
/>
YnSky,先谢啦
下载