asp.net上传多附件的实现方法
最近由于工作需要,需要作一个多附件上传的页面,本来,用asp,加上javascript语言可以轻松实现此功能(至于怎么轻松 ,借用马克。土温的话说:"我可以很高兴的立即回答你,我不知道” 谁叫我对这不熟悉~~)于是在网上找了半天,发现了一种实现方法,觉得此方法还算可以,写出来供大家交流同时,希望高手给予指点:
原理:asp.net上传附件用的是HtmlInputFile 控件,此控件的一个最重要的属性PostedFile,用来获取用户上传的附件,其类型为HttpPostFile。 当每次添加附件,形成回发,HtmlInputFile的属性postedfile都会有一个新值,所以正常情况下不能附加多个附件,但是若让每次添加附件的时候,把起属性postedfile的HttpPostFile实例对象存其来,等到提交是一起存储,就能实现多文件上传,而这些HttpPostFile对象的存储容器就是集合ArrayList,存储的地方是在Session中.
实现:声明一个集合类的对象 postfiels,添加附件时,把附件的PostedFile属性(其实是一个HttpPostedFile实例)添加到集合中。当上传时,遍历集合,对每个HttpPostedFile进行SaveAs操作,就可以实现多文件的上传了。 另外,最好和一些控件如:DropDownList或其他控件一起使用,这样用户可以知道自己上传了多少和上传了什么文件。
部分代码:
其中,第一个参数是HtmlInputFil的属性PostedFile,第二个参数是一个下拉列表控件,用来显示用户的已经上传的附件。并且,每次把附件的附件名(HtmlInputFil的FileName属性)添加到下拉列表的一个单元的text中
上传函数:
上传函数从会话中提取附件集合,并存储每个文件,让后将所有文件的文件名返回,以便将其存入数据库,另外,每次调用完上传函数后,一定要记得删除会话中的集合对象!!!否则,内存会急剧减少!
这个方法有个很大的缺点就是1耗内存,2由于集合对象无法序列化,所以webconfig中的session模式必须设置成InProc模式,不能用服务器和SQl模式。
我正想法做直接从客户端读取流的方法来上传附件,目前没有作出,呵呵
若有好的办法,欢迎赐教!!
原理:asp.net上传附件用的是HtmlInputFile 控件,此控件的一个最重要的属性PostedFile,用来获取用户上传的附件,其类型为HttpPostFile。 当每次添加附件,形成回发,HtmlInputFile的属性postedfile都会有一个新值,所以正常情况下不能附加多个附件,但是若让每次添加附件的时候,把起属性postedfile的HttpPostFile实例对象存其来,等到提交是一起存储,就能实现多文件上传,而这些HttpPostFile对象的存储容器就是集合ArrayList,存储的地方是在Session中.
实现:声明一个集合类的对象 postfiels,添加附件时,把附件的PostedFile属性(其实是一个HttpPostedFile实例)添加到集合中。当上传时,遍历集合,对每个HttpPostedFile进行SaveAs操作,就可以实现多文件的上传了。 另外,最好和一些控件如:DropDownList或其他控件一起使用,这样用户可以知道自己上传了多少和上传了什么文件。
部分代码:
1public void Addfile(System.Web.HttpPostedFile postfile,ref System.Web.UI.WebControls.DropDownList drop)
2 {
3
4 if(postfile.FileName!=null)
5 {
6 System.Collections.ArrayList postfiles;
7 HttpContext context=HttpContext.Current;
8 if(context.Session["postfiles"]==null)
9 {
10 postfiles=new System.Collections.ArrayList();
11 }
12 else
13 {
14 postfiles=(System.Collections.ArrayList)context.Session["postfiles"];
15 }
16
17 postfiles.Add(postfile);
18 context.Session["postfiles"]=postfiles;
19 System.Web.UI.WebControls.ListItem item=new System.Web.UI.WebControls.ListItem();
20 item.Text=postfile.FileName.Substring(postfile.FileName.LastIndexOf("\\")+1);
21 drop.Items.Add(item);
22 }
2 {
3
4 if(postfile.FileName!=null)
5 {
6 System.Collections.ArrayList postfiles;
7 HttpContext context=HttpContext.Current;
8 if(context.Session["postfiles"]==null)
9 {
10 postfiles=new System.Collections.ArrayList();
11 }
12 else
13 {
14 postfiles=(System.Collections.ArrayList)context.Session["postfiles"];
15 }
16
17 postfiles.Add(postfile);
18 context.Session["postfiles"]=postfiles;
19 System.Web.UI.WebControls.ListItem item=new System.Web.UI.WebControls.ListItem();
20 item.Text=postfile.FileName.Substring(postfile.FileName.LastIndexOf("\\")+1);
21 drop.Items.Add(item);
22 }
其中,第一个参数是HtmlInputFil的属性PostedFile,第二个参数是一个下拉列表控件,用来显示用户的已经上传的附件。并且,每次把附件的附件名(HtmlInputFil的FileName属性)添加到下拉列表的一个单元的text中
上传函数:
1 public string Upfiles(string path,string prefix,ref System.Web.UI.WebControls.DropDownList drop)
2 {
3 HttpContext context=HttpContext.Current;
4 if(context.Session["postfiles"]!=null)
5 {
6 System.Text.StringBuilder strb_filenames=new StringBuilder(); //用来存储附件名,用","分割;
7 strb_filenames.Append("'");
8 System.Collections.ArrayList files=(System.Collections.ArrayList)context.Session["postfiles"];
9 foreach(System.Web.HttpPostedFile pfile in files)
10 {
11 string sfilename=pfile.FileName.Substring(pfile.FileName.LastIndexOf("\\")+1);
12 pfile.SaveAs(path +prefix+ sfilename);
13 strb_filenames.Append((prefix+sfilename)+",");
14 }
15 drop.Items.Clear();
16 strb_filenames.Append("'");
17 return strb_filenames.ToString();
18 }
19 else
20 {
21 return null;
22 }
23 }
2 {
3 HttpContext context=HttpContext.Current;
4 if(context.Session["postfiles"]!=null)
5 {
6 System.Text.StringBuilder strb_filenames=new StringBuilder(); //用来存储附件名,用","分割;
7 strb_filenames.Append("'");
8 System.Collections.ArrayList files=(System.Collections.ArrayList)context.Session["postfiles"];
9 foreach(System.Web.HttpPostedFile pfile in files)
10 {
11 string sfilename=pfile.FileName.Substring(pfile.FileName.LastIndexOf("\\")+1);
12 pfile.SaveAs(path +prefix+ sfilename);
13 strb_filenames.Append((prefix+sfilename)+",");
14 }
15 drop.Items.Clear();
16 strb_filenames.Append("'");
17 return strb_filenames.ToString();
18 }
19 else
20 {
21 return null;
22 }
23 }
上传函数从会话中提取附件集合,并存储每个文件,让后将所有文件的文件名返回,以便将其存入数据库,另外,每次调用完上传函数后,一定要记得删除会话中的集合对象!!!否则,内存会急剧减少!
这个方法有个很大的缺点就是1耗内存,2由于集合对象无法序列化,所以webconfig中的session模式必须设置成InProc模式,不能用服务器和SQl模式。
我正想法做直接从客户端读取流的方法来上传附件,目前没有作出,呵呵
若有好的办法,欢迎赐教!!
