您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页asp.net上传多附件的实现方法

asp.net上传多附件的实现方法

来源:五一七教育网
  最近由于工作需要,需要作一个多附件上传的页面,本来,用asp,加上javascript语言可以轻松实现此功能(至于怎么轻松 ,借用马克。土温的话说:"我可以很高兴的立即回答你,我不知道”  谁叫我对这不熟悉~~)于是在网上找了半天,发现了一种实现方法,觉得此方法还算可以,写出来供大家交流同时,希望高手给予指点:  
  原理:asp.net上传附件用的是HtmlInputFile 控件,此控件的一个最重要的属性PostedFile,用来获取用户上传的附件,其类型为HttpPostFile。 当每次添加附件,形成回发,HtmlInputFile的属性postedfile都会有一个新值,所以正常情况下不能附加多个附件,但是若让每次添加附件的时候,把起属性postedfile的HttpPostFile实例对象存其来,等到提交是一起存储,就能实现多文件上传,而这些HttpPostFile对象的存储容器就是集合ArrayList,存储的地方是在Session中.
    实现:声明一个集合类的对象 postfiels,添加附件时,把附件的PostedFile属性(其实是一个HttpPostedFile实例)添加到集合中。当上传时,遍历集合,对每个HttpPostedFile进行SaveAs操作,就可以实现多文件的上传了。 另外,最好和一些控件如:DropDownList或其他控件一起使用,这样用户可以知道自己上传了多少和上传了什么文件。 

   部分代码:

  
 1 public   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             }

  其中,第一个参数是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          }
  
上传函数从会话中提取附件集合,并存储每个文件,让后将所有文件的文件名返回,以便将其存入数据库,另外,每次调用完上传函数后,一定要记得删除会话中的集合对象!!!否则,内存会急剧减少!

  这个方法有个很大的缺点就是1耗内存,2由于集合对象无法序列化,所以webconfig中的session模式必须设置成InProc模式,不能用服务器和SQl模式。
   我正想法做直接从客户端读取流的方法来上传附件,目前没有作出,呵呵
   若有好的办法,欢迎赐教!!
 

转载于:https://www.cnblogs.com/blackpaladin/archive/2005/09/20/240500.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务