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


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

    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作为外键附加在文件的数据库上。

  • 相关阅读:
    LeetCode 222. Count Complete Tree Nodes
    k8s控制节点etcd删除并重新加入
    k8s证书延长时间(二)
    二进制安装多master节点的k8s集群(2)
    kubeadm安装多master节点的k8s集群(1)
    OutOfMemoryError异常总结
    使用线程
    操作系统基础
    java 代码执行顺序
    jvm的内存模型
  • 原文地址:https://www.cnblogs.com/juan/p/1430698.html
Copyright © 2020-2023  润新知