多文件的上传、管理与下载

单文件的上传较为简单、容易实现,用的也较为广泛,如论坛发帖附加的图片、文档、压缩包等,其实现的步骤大概如下(以图片类型的上传为例并略去数据库写入操作):但假如我们要一次实现多个文件的同时上传的要求,如网易的邮箱附件的增加那样的功能,那么其实现就变得相对复杂,基本思路是:首先是实现上传控件的动态添加功能,接着把这些控件集读入缓存,当要执行文件上传时,再从缓存中读取数据,上传文件并写入数据库。

private void Button1_Click(object sender, System.EventArgs e)
  {
   string fullname=this.File1.PostedFile.FileName;

//得出全部的文件路径和名字
   string vfilename=fullname.Substring(fullname.LastIndexOf("\\")+1);

//截取长文件名中最后一个\后面的字符作为文件名字
   string type=vfilename.Substring(vfilename.LastIndexOf(".")+1);

//截取长文件名中最后一个.后面的字符作为文件类型
   string size=Convert.ToString(this.File1.PostedFile.ContentLength);//文件大小
   string type=this.File1.PostedFile.ContentType;  //文件类型
   if(type=="jpg"||type=="bmp"||type=="gif"||type=="png")

//如果类型等于规定的这几种就存
   {
    this.File1.PostedFile.SaveAs(Server.MapPath("up")+"\\"+vfilename);

//利用saveAs方法把文件存在服务器上
    this.Image1.ImageUrl=Server.MapPath("up")+"\\"+vfilename;

//马上显示最近上传的图片
   }
   else
   {
   Response.Write("<Script language='javascript'>alert('图片格式错误')</script>");//否则提示用户错误
   }
  }

  

 

 

 

    为实现以上设计,我们相应的定义四个方法。

    InsertC方法;用于执行添加一个上传控件的操作。HtmlTableRow相当于html的<tr>标签,而相应的HtmlTableCell相当于html里面的<td>标签,其作用在于动态的增加一个一行一列的table,然后把控件往动态添加的table里面填充,最后写入缓存。其详细代码如下:

private void InsertC()
    {
        ArrayList AL = new ArrayList();
        this.F.Rows.Clear();
        GetInfo();
        HtmlTableRow HTR = new HtmlTableRow();
        HtmlTableCell HTC = new HtmlTableCell();
        HTC.Controls.Add(new FileUpload());
        HTR.Controls.Add(HTC);
        F.Rows.Add(HTR);
        SFUPC();
    }

    SFUPC方法:该方法用于保存当前页面上传文件控件集到缓存中。首先创建一个动态数组AL,然后再把table中的上传控件依次读入AL,最后再把数组中的数据保存在session中。实现如下

private void SFUPC()
    {
        ArrayList AL = new ArrayList();
        foreach (Control C in F.Controls)
        {
            if (C.GetType().ToString() == "System.Web.UI.HtmlControls.HtmlTableRow")
            {
                HtmlTableCell HTC = (HtmlTableCell)C.Controls[0];
                foreach (Control FUC in HTC.Controls)
                {
                    if (FUC.GetType().ToString() == "System.Web.UI.WebControls.FileUpload")
                    {
                        FileUpload FU = (FileUpload)FUC;
                        AL.Add(FU);
                    }
                }
            }
        }
        Session.Add("FilesControls", AL);
    }

     GetInfo方法:该方法用于读取缓存中存储的上传文件控件集。该方法是SFUPC方法的逆操作,即是把session中的信息重新读入数组AL,再一次填充table:

 private void GetInfo()
    {
        ArrayList AL = new ArrayList();
        if (Session["FilesControls"] != null)
        {
            AL = (System.Collections.ArrayList)Session["FilesControls"];
            for (int i = 0; i < AL.Count; i++)
            {
                HtmlTableRow HTR = new HtmlTableRow();
                HtmlTableCell HTC = new HtmlTableCell();
                HTC.Controls.Add((System.Web.UI.WebControls.FileUpload)AL[i]);
                HTR.Controls.Add(HTC);
                F.Rows.Add(HTR);
            }
        }
    }

    UpFile方法:该方法用于执行文件上传操作。HttpFileCollection相当于一个容器,把文件存入再取出最后上传,写入数据库部分较为简单省略了

private void UpFile()
    {
        string FilePath = Server.MapPath("./") + "File";

        HttpFileCollection HFC = Request.Files;
        for (int i = 0; i < HFC.Count; i++)
        {
            HttpPostedFile UserHPF = HFC[i];
            try
            {
                if (UserHPF.ContentLength > 0)
                {
                    UserHPF.SaveAs(FilePath + "\\" + System.IO.Path.GetFileName(UserHPF.FileName));

//此处省略数据库操作
                }
            }
            catch
            {
                Label1.Text = "处理出错!";
            }

        }
        if (Session["FilesControls"] != null)
        {
            Session.Remove("FilesControls");
        }
        Label1.Text = "上传成功!";
    }

   管理与下载:管理和下载部分的操作也较为简单,这里只是假设这些文件是一个新闻系统发出通知的附件,那么多个附件的上传如何在通知中一一显示并一点击就下载,该功能在业务层实现似乎较麻烦繁杂,于是改为在底层实现。

    通知与多个文件是一对多的关系,定义数据库的关系为一对多的关系,然后再定义视图,链接一下即可实现插入与删除的约束,即把通知的id作为外键附加在文件的数据库上。

posted @ 2009-04-07 09:52  智者生存  阅读(651)  评论(0编辑  收藏  举报