shawl.qiu c# .net upload class v1.3

类别: CSharp.Net, 类库
标签: upload, .net, uploader, c#
摘要: 上传文件
正文:
1. ascx 调用
2. Upload 类

1. ascx 调用
  1. <!-- DW6 -->
  2. <%@ Control Language="C#" AutoEventWireup="TrueclassName="xxx" %>

  3. <%@ Assembly Name = "SQ" %>
  4. <%@ Assembly Name = "Sys" %>
  5. <%@ import Namespace="SQ" %>
  6. <%@ import Namespace="Sys" %>
  7. <%@ import Namespace="System.Data" %>
  8. <%@ import Namespace="System.Data.OleDb" %>

  9. <script runat="server">
  10.  DataTable UpCfgDt = Datum.GetDataTable("select top 1 * from uploadconfig", Sys.Conn);

  11.  void Page_Load(Object s, EventArgs e)
  12.  {
  13.      if(!IsPostBack)
  14.         {
  15.         }
  16.         Upload up = new Upload();
  17.             
  18.             up.Debug = true;
  19.             up.AutoRename = bool.Parse(UpCfgDt.Rows[0]["upAutoRename"]+"");
  20.             
  21.             up.UploadPath = UpCfgDt.Rows[0]["upPath"]+"";
  22.             up.Extension = UpCfgDt.Rows[0]["upExt"]+"";
  23.             
  24.             up.GoBackUrl = UpCfgDt.Rows[0]["upGobackUrl"]+"";
  25.             
  26.             up.UploadSessionName = UpCfgDt.Rows[0]["upSessionName"]+"";
  27.             
  28.             up.Interval = int.Parse(UpCfgDt.Rows[0]["upInterval"]+"");
  29.             up.GoBackSecond = int.Parse(UpCfgDt.Rows[0]["upGobackSecond"]+"");
  30.             
  31.             up.TotalItem = int.Parse(UpCfgDt.Rows[0]["upTotalItem"]+"");
  32.             
  33.             up.TotalKb = int.Parse(UpCfgDt.Rows[0]["upTotalKb"]+"");
  34.             up.SingleKb = int.Parse(UpCfgDt.Rows[0]["upSingleKb"]+"");
  35.             
  36.             up.UploadPlaceHolder = ph;
  37.             
  38.             up.ReturnFilePathWithKb=new OneArgStringDelegate(AddItemToDb);
  39.             
  40.             up.Go();
  41.             
  42.             up = null;
  43.  } // end Page_Load
  44.     
  45.     void AddItemToDb(string ipt)
  46.     {
  47.      bool Debug = false;
  48.         
  49.         string[] PathRge = ipt.Split(',');
  50.         
  51.         if(Debug)
  52.         {
  53.          Response.Write("<li/>AddItemToDb: Ok");
  54.          Response.Write("<li/>ipt: "+ipt);
  55.             Response.Write("<li/>PathRge.Length: "+PathRge.Length);
  56.         } // end if
  57.         
  58.         for(int i=0, j=PathRge.Length; i<j; i++)
  59.         {
  60.          string[] PartRge = PathRge[i].Split(':');
  61.             string UpName = System.IO.Path.GetFileName(PartRge[0]);
  62.             
  63.             if(Debug)
  64.             {
  65.              Response.Write("<li/>UpName: "+UpName);
  66.              Response.Write("<li/>PartRge[0]: "+PartRge[0]);
  67.              Response.Write("<li/>PartRge[1]: "+PartRge[1]);
  68.             } // end if
  69.             
  70.             OleDbConnection oCnn = new OleDbConnection(Sys.Conn);
  71.             OleDbCommand oCmd = new OleDbCommand("insert into upload(upname,uppath,upsizebykb) "+
  72.                 "values(@upname,@uppath,@upsizebykb)", oCnn);
  73.             
  74.             OleDbParameter oParamupname = new OleDbParameter("@upname", "OleDbType.Varchar");
  75.             oParamupname.Value = UpName;
  76.             oCmd.Parameters.Add(oParamupname);
  77.             
  78.             OleDbParameter oParamuppath = new OleDbParameter("@uppath", "OleDbType.Varchar");
  79.             oParamuppath.Value = PartRge[0];
  80.             oCmd.Parameters.Add(oParamuppath);
  81.             
  82.             OleDbParameter oParamupsize = new OleDbParameter("@upsizebykb", "OleDbType.Varchar");
  83.             oParamupsize.Value = PartRge[1];
  84.             oCmd.Parameters.Add(oParamupsize);
  85.                 
  86.             oCnn.Open();
  87.             oCmd.ExecuteNonQuery();
  88.             oCnn.Close();
  89.         } // end for
  90.         
  91.     } // end void AddItemToDb
  92.  
  93. </script>
  94. <div class="UpMain">
  95.     <asp:PlaceHolder id=ph runat=server 
  96.         />
  97. </div>
2. Upload 类
  1. using System;
  2. using System.Collections;
  3. using System.IO;
  4. using System.Text.RegularExpressions;
  5. using System.Web;
  6. using System.Web.UI;
  7. using System.Web.UI.WebControls;
  8. using System.Web.UI.HtmlControls;

  9. public delegate void OneArgStringDelegate(String Str);
  10. /*-----------------------------------------------------------------------------------*\
  11.  * shawl.qiu c# .net Upload class v1.3
  12. \*-----------------------------------------------------------------------------------*/
  13. //---------------------------------------------------------------------begin class upload
  14. public class Upload
  15. {
  16.  //-----------------------------------begin event
  17.  public Upload()
  18.  {
  19.  }
  20.  
  21.  ~Upload()
  22.  {
  23.  }
  24.  //-----------------------------------end event
  25.  
  26.  //-----------------------------------begin public constant
  27.  //-----------------------begin about
  28.  public const string auSubject = "shawl.qiu c# .net Upload class";
  29.  public const string auVersion = "v1.3";
  30.  public const string au = "shawl.qiu";
  31.  public const string auEmail = "shawl.qiu@gmail.com";
  32.  public const string auBlog = "http://blog.csdn.net/btbtd";
  33.  public const string auCreateDate = "2007-1-30";
  34.  public const string auFirstUpdate = "2007-2-8 v1.1";
  35.  public const string auSecondUpdate = "2007-2-27 v1.2";
  36.  public const string auUpdate3 = "2007-4-29 v1.3";
  37.  //-----------------------end about
  38.  //-----------------------------------end public constant
  39.  
  40.  //-----------------------------------begin public variable
  41.  public bool Debug = false;
  42.  public bool AutoRename=false;
  43.  
  44.  public string UploadPath = "/uploads/";
  45.  public string Extension = ".7z|.rar|.zip|.mp3|.bmp|.gif|.jpg|.jpeg|.png|.txt|.swf";
  46.  public string GoBackUrl = "?";
  47.  
  48.  public string UploadSessionName = "sqUploadCheckInterver";
  49.  
  50.  public int Interval = 10;
  51.  public int GoBackSecond = 10;
  52.  public int TotalItem = 5;
  53.  public int TotalKb = 1024*5;
  54.  public int SingleKb = 1024;
  55.  
  56.  public PlaceHolder UploadPlaceHolder;
  57.  
  58.  public OneArgStringDelegate ReturnFilePath;
  59.  public OneArgStringDelegate ReturnFilePathWithKb;
  60.  
  61.  //-----------------------------------end public variable
  62.  
  63.  //-----------------------------------begin public method
  64.  public void Go()
  65.  {
  66.   if(UploadPlaceHolder!=null)
  67.   {
  68.    UploadPlaceHolder.Controls.Add(ErrorLabel);
  69.    UploadPlaceHolder.Controls.Add(GobackLabel);
  70.    UploadPlaceHolder.Controls.Add(UploadDetailsLabel);
  71.    
  72.    InfoLabel=new Label();
  73.    InfoLabel.Text="<ul>\n"+
  74.     "<li>当前上传路径: <b>"+UploadPath+"</b></li>\n"+
  75.     "<li>允许上传的文件类型<b>: "+Extension+"</b></li>\n"+
  76.     "<li>每次总上传大小最大为 <b>: "+TotalKb+"kb</b>, 每文件最大为 <b>"+
  77.     SingleKb+"kb</b>.</li>\n"+
  78.     "<li>每次上传时间间隔为<b>: "+Interval+"</b>秒.</li>\n"+
  79.     "</ul>";
  80.      
  81.    UploadPlaceHolder.Controls.Add(InfoLabel);
  82.     
  83.     LiteralBox=new Literal();
  84.     LiteralBox.Text="<ol>";
  85.     UploadPlaceHolder.Controls.Add(LiteralBox);
  86.    
  87.    for(int i=0; i<TotalItem; i++)
  88.    {
  89.     LiteralBox=new Literal();
  90.     LiteralBox.Text="<li>";
  91.     UploadPlaceHolder.Controls.Add(LiteralBox);
  92.     
  93.     UpInputItem = new HtmlInputFile(); 
  94.     UploadPlaceHolder.Controls.Add(UpInputItem);
  95.     
  96.     LiteralBox=new Literal();
  97.     LiteralBox.Text="</li>\n";
  98.     UploadPlaceHolder.Controls.Add(LiteralBox);
  99.    }     
  100.     
  101.    LiteralBox=new Literal();
  102.    LiteralBox.Text="</br/>\n";
  103.    UploadPlaceHolder.Controls.Add(LiteralBox);
  104.    
  105.    SubmitButton=new Button();
  106.    SubmitButton.Text="Upload now";
  107.    SubmitButton.Click+=new EventHandler(go);
  108.    SubmitButton.Attributes["onclick"]="javascript:return confirm('现在上传文件吗?')";
  109.    UploadPlaceHolder.Controls.Add(SubmitButton);
  110.     
  111.    LiteralBox=new Literal();
  112.    LiteralBox.Text=" <input type=\"reset\" value=\"reset\""+
  113.    " onclick=\"return confirm('现在重置吗');\" />";
  114.    UploadPlaceHolder.Controls.Add(LiteralBox);
  115.     
  116.    LiteralBox=new Literal();
  117.    LiteralBox.Text="</ol>\n";
  118.    UploadPlaceHolder.Controls.Add(LiteralBox);
  119.   }
  120.  } // end public void UploadBox
  121.  
  122.  public void go(Object s, EventArgs e)
  123.  {
  124.   
  125.   if(HttpContext.Current.Session[UploadSessionName]==null)
  126.   {
  127.    HttpContext.Current.Session[UploadSessionName]=DateTime.Now;
  128.   }
  129.   
  130.   DateTime dtSession=DateTime.Parse(HttpContext.Current.Session[UploadSessionName]+"");

  131.   if(dtSession>DateTime.Now)
  132.   {
  133.    TimeSpan hasInterval=dtSession-DateTime.Now;
  134.    
  135.    GoBack("每次上传时间间隔为 "+Interval+" 秒, 请稍候...",
  136.     hasInterval.Seconds, GoBackUrl, GobackLabel);
  137.    return;
  138.   }
  139.   
  140.   //---------------------检测上传目录是否存在
  141.   String path_phs=HttpContext.Current.Server.MapPath(UploadPath);
  142.   if(!Directory.Exists(path_phs))
  143.   {
  144.    if(InfoLabel!=null)
  145.    {
  146.     InfoLabel.Text+="<h2>指定的上传目录不存在, 操作被取消.</h2>";
  147.    }
  148.    return;
  149.   }
  150.   
  151.   int upTotal=HttpContext.Current.Request.ContentLength/1024;
  152.   int total=HttpContext.Current.Request.Files.AllKeys.Length;
  153.   
  154.   ArrayList aUpsize=new ArrayList();
  155.   ArrayList aNoExt=new ArrayList();
  156.   ArrayList aNotAllowExt=new ArrayList();
  157.   ArrayList aFinished=new ArrayList();
  158.   
  159.   if(upTotal>TotalKb) goto Upsize;
  160.    
  161.   for(int i=0; i<total; i++)
  162.   {
  163.    System.Web.HttpPostedFile files=HttpContext.Current.Request.Files[i];
  164.    if(files.ContentLength>0)
  165.    { 
  166.     String flnm=Path.GetFileName(files.FileName);
  167.     String justnm=Path.GetFileNameWithoutExtension(files.FileName);
  168.     String justext=Path.GetExtension(files.FileName);
  169.     
  170.     string fileExt = Path.GetExtension(files.FileName);
  171.     
  172.     String flph=UploadPath+justnm+justext;
  173.     String flph_phs=HttpContext.Current.Server.MapPath(flph);
  174.     
  175.     //-----------------------------------单文件超出限制大小
  176.     int flSize=files.ContentLength/1024;
  177.     if(flSize>SingleKb)
  178.     {
  179.      aUpsize.Add("文件: "+flnm+", 大小为: "+flSize+" kb.");
  180.      continue;
  181.     }    
  182.     
  183.     if(!Path.HasExtension(flnm))
  184.     {
  185.      aNoExt.Add("文件: "+flnm+", 没有扩展名.");
  186.      continue;
  187.     }
  188.     
  189.     if(!FilterItem(Extension, fileExt, '|'))
  190.     {
  191.      aNotAllowExt.Add("不允许上传的文件扩展: "+flnm);
  192.      continue;
  193.     }
  194.     
  195.     if(File.Exists(flph_phs)) //------------------已存在相同同名文件
  196.     {
  197.      if(AutoRename)
  198.      { 
  199.       int iRename=1;
  200.       while(true)
  201.       {
  202.        String sNameTemp=HttpContext.Current.
  203.         Server.MapPath(UploadPath+justnm+"_"+(iRename++)+justext);
  204.        if(!File.Exists(sNameTemp))
  205.        {
  206.         flph_phs=sNameTemp;
  207.         goto SaveFile;
  208.        } // end if 3
  209.       } // end while
  210.      } // end if 2
  211.     } // end if 1
  212.     SaveFile:;
  213.      files.SaveAs(flph_phs);
  214.   
  215.      String flnmTemp=Path.GetFileName(flph_phs);
  216.      aFinished.Add("文件: "+flnmTemp+" 已上传, 大小为 "+flSize+" Kb.");
  217.      
  218.      AllFilePath+=UploadPath+flnmTemp+",";
  219.      AllFilePathWithKb += UploadPath+flnmTemp+":"+flSize+",";
  220.      
  221.      HttpContext.Current.Session[UploadSessionName]=
  222.       DateTime.Now.AddSeconds(Interval);
  223.    } // end if
  224.   } // end for
  225.   goto Report;
  226.   
  227.   Upsize:
  228.    ErrorLabel.Text+="<h2 style='text-align:center;'>上传大小超出限制, 已被终止.</h2>";
  229.    GoBack(GoBackSecond+" 秒后返回, 还有 ", 
  230.     GoBackSecond, GoBackUrl, GobackLabel);
  231.   return;
  232.    
  233.   Report:
  234.    listAl("已上传文件 ", aFinished, UploadDetailsLabel);
  235.    listAl("单文件超出限制大小的有 ", aUpsize, UploadDetailsLabel);
  236.    listAl("没有文件扩展名的有 ", aNoExt, UploadDetailsLabel);
  237.    listAl("不允许上传的文件扩展有 ", aNotAllowExt, UploadDetailsLabel);

  238.    GoBack("操作已完毕, "+GoBackSecond+" 秒后返回, 还有 ", 
  239.     GoBackSecond, GoBackUrl, GobackLabel);

  240.    AllFilePath = Regex.Replace(AllFilePath,",$","");
  241.    AllFilePathWithKb = Regex.Replace(AllFilePathWithKb,",$","");
  242.    
  243.    if(ReturnFilePath!=null)
  244.    { 
  245.     ReturnFilePath(AllFilePath);
  246.    } // end if
  247.    
  248.    if(ReturnFilePathWithKb != null)
  249.    {
  250.     ReturnFilePathWithKb(AllFilePathWithKb);
  251.    } // end if
  252.  } // end go
  253.  //-----------------------------------end public method
  254.  
  255.  //-----------------------------------begin private variable
  256.  private String AllFilePath = "";
  257.  private string AllFilePathWithKb = "";
  258.  
  259.  private Label InfoLabel;
  260.  private Label GobackLabel=new Label();
  261.  private Label UploadDetailsLabel=new Label();
  262.  private Label ErrorLabel=new Label();
  263.  
  264.  private Literal LiteralBox;
  265.  
  266.  private Button SubmitButton;
  267.  
  268.  private HtmlInputFile UpInputItem;
  269.  //-----------------------------------end private variable
  270.  
  271.  //-----------------------------------begin private method
  272.  private bool FilterItem(string filterList, string forFilter, char separater)
  273.  {
  274.   string[] sArray = filterList.Split(separater);
  275.   for(int i = 0, j = sArray.Length; i < j; i++)
  276.   {
  277.    if(string.Compare(sArray[i], forFilter, true)==0)return true;
  278.   }
  279.   return false;
  280.  } // end private bool FilterItem
  281.  
  282.  private void listAl(String sDetail, ArrayList oAl, Label UploadDetailsLabel)
  283.  {
  284.   if(oAl.Count>0)
  285.   {
  286.    UploadDetailsLabel.Text+="<ol><label>"+sDetail+"<b>"+
  287.     oAl.Count+"个</b>.</label>";
  288.    foreach(Object TotalItem in oAl)
  289.    {
  290.     UploadDetailsLabel.Text+="<li>"+TotalItem+"</li>";
  291.    }
  292.    UploadDetailsLabel.Text+="</ol><hr/>";
  293.   }
  294.  }
  295.  
  296.  private void GoBack(String sPrompt, Int32 iSecond, String sUrl, Label GobackLabel)
  297.  {
  298.   if(GobackLabel==nullreturn;
  299.   GobackLabel.Text+="<script type=\"text/javascript\">\n";
  300.   GobackLabel.Text+="//<![CDATA[\n";
  301.   GobackLabel.Text+=var temp=onload;\n";
  302.   GobackLabel.Text+=onload=function(){\n";
  303.   GobackLabel.Text+="  try{temp()}catch(e){}\n";
  304.   GobackLabel.Text+="  fTimer("+iSecond+",'timer', 10);\n";
  305.   GobackLabel.Text+=" }\n";
  306.   GobackLabel.Text+="  function fTimer(iTimestamp, sId, iMs){\n";
  307.   GobackLabel.Text+="  if(!(iTimestamp.constructor==Date)){\n";
  308.   GobackLabel.Text+="   var sqTimeStamp=new Date();\n";
  309.   GobackLabel.Text+="   sqTimeStamp.setSeconds(sqTimeStamp.getSeconds()+iTimestamp);\n";
  310.   GobackLabel.Text+="   iTimestamp=sqTimeStamp;\n";
  311.   GobackLabel.Text+="  }\n";
  312.   GobackLabel.Text+="    var tl=arguments.callee;\n";
  313.   GobackLabel.Text+="    if(typeof sId=='string'){\n";
  314.   GobackLabel.Text+="   var oEle=document.getElementById(sId);\n";
  315.   GobackLabel.Text+="  } else {\n";
  316.   GobackLabel.Text+="   var oEle=sId;\n";
  317.   GobackLabel.Text+="  }\n";
  318.   GobackLabel.Text+="  var dt=new Date();\n";
  319.   GobackLabel.Text+="  var iCk=((iTimestamp.getTime()-dt.getTime())/1000).toFixed(3);\n";
  320.   GobackLabel.Text+="  if(iCk<=0){\n";
  321.   GobackLabel.Text+="   oEle.innerHTML='00.000';\n";
  322.   GobackLabel.Text+="   return false;\n";
  323.   GobackLabel.Text+="  } else {\n";
  324.   GobackLabel.Text+="   oEle.innerHTML=iCk;\n";
  325.   GobackLabel.Text+="   var iTimer=setTimeout(function(){tl(iTimestamp, oEle, iMs)},iMs); \n";
  326.   GobackLabel.Text+="  }\n";
  327.   GobackLabel.Text+=" } // end function fTimer // shawl.qiu script\n";
  328.   GobackLabel.Text+="//]]>\n";
  329.   GobackLabel.Text+="</script>\n";

  330.   GobackLabel.Text+="<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />";
  331.   GobackLabel.Text+="<meta http-equiv=\"refresh\" content=\""+iSecond+";URL="+sUrl+"\">";
  332.   GobackLabel.Text+="<div style=\"display:table;width:100%;background-color:yellow!important;"+
  333.     "color:black!important;text-align:center!important;\">"+
  334.     sPrompt+", <span id='timer'>"+iSecond+"</span>秒 后返回.</div>";
  335.  }
  336.  
  337.  private void GoBack(String sPrompt, Int32 iSecond, bool byReferrer, Label GobackLabel)
  338.  {
  339.   if(GobackLabel==null)return;
  340.   string url = "?";
  341.   if(byReferrer) url = HttpContext.Current.Request.UrlReferrer+"";
  342.   GoBack(sPrompt, iSecond, url, GobackLabel);
  343.  } 
  344.  //-----------------------------------end private method
  345. }
  346. //---------------------------------------------------------------------end class Upload 



文章相关信息:
主题: shawl.qiu c# .net upload class v1.3
发表者: shawl.qiu
电子邮件: shawl.qiu@gmail.com
QQ: 908202921
MSN: btbtd@msn.com
Homepage: http://www.btbtd.org/
Blog: http://blog.csdn.net/btbtd/
发表日期: 2007-4-29 12:02:07
更新日期: 2007-4-29 12:02:07
来源引用: shawl.qiu CSharp DotNet 个人资料管理系统
引用本页: http://gi.2288.org/mod/code/display/Default.aspx?aid=341
关闭
Google
搜索WWW
搜索www.btbtd.org
搜索blog.csdn.net
Powered by shawl.qiu © 2008-2010 the shawl.qiu Javascript Kits
Copyright © 2008-2010 by shawl.qiu