今天终于将一个多文件同时上传的问题解决了。并编写了一个类和用户控件,该用户控件有如下功能:
1.可以选择上传文件个数,一次性最多上传10个文件。
2.可以自定义上传文件类型。
3.不用关心是否必需要选择文件,即您选择一次上传5个文件,但是您发现只用上传4个文件,没关系,可以将任意一个文件空出来。
4.智能性的结果察看功能,您上传完后,将自动计算出您上传的文件、重复的文件、不符合格式的文件等数据,让您一看就知道上传结果如何,以便继续上传。
5.采用MagicAjax减少链接数量,提高用户体验。
下载:
源文件注意:您下载好后,按照上述所在文件目录放好后,使用VS.2005新建网站,然后将它们复制过去,然后按F5就可以正确浏览UploadFile.aspx了。
不过在实现该功能的时候,并不是没有遇到困难的。首先让我头痛不已的就是:container.Controls.Add(control)。这个功能让我摸索了好久,最终发现使用该方法添加的服务器端控件在重新导向该页面的时候就没有了,莫名其妙,根本没法操作它,不知道Microsoft搞出这样一个功能是用来干什么的。看下面的代码:
protected void Button1_Click()
{
for(uint i=0;i<5;i++)
{
Panel1.controls.Add(new FileUpload());
}
}
protected void Button2_Click()
{
}
先点击一下Button1,看看效果,Panel1里面多了5个FileUpload,然后再点击Button2,奇怪,那五个FileUpload居然消失了,而且我追踪了好久,还是一事无成,根本无法控制那几个动态添加的FileUpload。不知道有哪位高手,直到如何控制动态添加的服务器端控件,请告知啊!
此法不成,于是想到了另外一个比较大胆的方法:原本就存在十个FileUpload,想要几个的时候,将剩下的几个隐藏起来就OK了。想法很好,并且很好实现。但是难就难在和MagicAjax结合使用了,搞了半天才搞明白原因:FileUpload没有autoPostBack属性,所以MagicAjax Panel无法获得其属性。具体为什么不能获得没有autoPostBack属性的控件的属性的原因,请参照我前一篇介绍MajaxAjax的文章。
http://www.wubingStudy.com/Articles.asp?id=79 但生性倔强的我,怎么也的让整个程序完美的运行,只要有更好的提高用户体验的方法,我决不放过。于是慢慢摸索适中的方法:在动态产生自定义的文件的时候,使用AjaxCallConnection = "Ascy"。而上传文件的时候使用AjaxCallConnection = "none"。事实上在我后来发现了MagicAjaz的一些Bug。看下面代码:
protected void Page_OnLoad()
{
if(!IsPostBack)
{
FileUpload1.Visible = false;
}
}
protected void Button1_Click()
{
Label1.text = FileUpload1.hasFile;
}
奇怪的事情发生了:您即使选择了要上传的文件,点击Button1后,结果Label.text还是为"false",如果您将if(!IsPostBack){...}里面的语句删掉,或则改成别的。当您选择了要上传的文件,点击Button1后,结果Label1.text的值就变成了"true",我尝试了好多方法想找到其中的原因,结果还是没找到。如果哪位高手知道如何办,请给小弟我解答呀,异常感谢。
无论怎么样,最后还是搞定了,虽然与预期想像的制作方式相差甚远,但结果都差差不多。