ASP.NET 2.0(C#)实现多文件上传

(原)ASP.NET 2.0(C#)实现多文件上传
作者: zyf0808 发表日期: 2006-08-27 16:40 文章属性: 原创 复制链接


      用户控件的使用可以大大提高程序的开发进度,同时,也使代码规范整洁,程序结构清晰。本文基于实际项目,实现了一个多文件上传的用户控件。
下面先简单描述一下控件的功能:

1、可以实现多文件上传,可控制上传数量,可以添加文件的描述;
2、可以控制上传文件的格式类型,通过设置不同的格式类型,可以实现多图片的上传、多文件的上传、多视频的上传;当然,你也可以混合上传;
3、上传的文件即可显示在列表中,可以查看图片及删除上传的图片;

控件外观如下:控件外观

      因项目基于分层模式,所以控件的实现也是在common层定义了一个DataSet——ImageData,下面是部分其代码:
public class ImagesData : DataTable
    {
        //你还可以添加其他文件信息,这里文件的保存格式为:url+info;url+info;...
        public const string URL_FIELD = "URL_FIELD";
        public const string INFO_FIELD = "INFO_FIELD";


        private ImagesData(SerializationInfo info, StreamingContext context)
            : base(info, context)
         {  
         }  


        public ImagesData()
        {
            this.Columns.Add(new DataColumn(URL_FIELD, typeof(System.String)));
            this.Columns.Add(new DataColumn(INFO_FIELD,typeof(System.String)));
        }

        public void FillImageDataSet(string images, ImagesData imageData)
        {
            if (images == null || images.Trim().Length == 0)
            {
                return;
            }
            string[] items = images.Split(new char[1] { ';' }, StringSplitOptions.RemoveEmptyEntries);
            string[] url_info = null;
            foreach (string item in items)
            {
                DataRow dr = imageData.NewRow();
                url_info = item.Split(':');
                dr[URL_FIELD] = url_info[0];
                dr[INFO_FIELD] = url_info[1];
                imageData.Rows.Add(dr);
            }
        }

       
        public void AppendImageChunk(StringBuilder sb,string url,string info)
        {
            if (sb.Length != 0)
            {
                sb.Append(";");
            }
            sb.Append(url).Append(":").Append(info);
        }
    }
}

下面介绍控件wucMultiFileUpload的实现:
    public const string IMAGES_TABLE = "IMAGES_TABLE";
    private StringBuilder images = new StringBuilder();//路径属性值:url+info
    bool enabled = true;
    private string attachmentDir = "";  //上传路径设定
    private int number = 0;  //允许上传的数量
    private string format = "";  //允许上传的文件格式类型;空为不限制
实现原理:
    上传时先判断上传文件的类型,如果,控件设定属性时,允许上传该格式的文件,则上传,同时开始计数,只有当文件类型允许上传且上传数量没有超过限定数量时,才允许上传文件,否则,提示出错信息。
    每上传一次图片, 通过  ViewState[IMAGES_TABLE] = imageData 保持已上传的图片,并在 DataList 中显示。
    DataList中,显示了对文件的描述信息和一个删除按钮。描述信息是一个HyperLink,连接到文件;删除按钮通过绑定文件的url值来删除文件。
附部分关键代码如下:

    private void BindImages(string imageValues)
    {
        if (imageValues.Equals(String.Empty))
            return;

        ImagesData imageData = new ImagesData();
        imageData.FillImageDataSet(imageValues, imageData);

        dlAttachments.DataSource = imageData;
        dlAttachments.DataBind();
    }

   protected void btUpload_Click(object sender, EventArgs e)
    {
        int num =0;  //已经上传的数量
        if (ViewState["num"] != null)
            num = (int)ViewState["num"];

        //实现上传,同时,将路径拼好,存在images中
        if (fuUpload.FileName == null || fuUpload.FileName.Length == 0 || fuUpload.FileContent == null)
        {
            return;
        }
        if (number != 0)  //number == 0 无数量限制
        {
            if ( ViewState["num"]!= null && (int)ViewState["num"] >= number )
            {
                lbMessage.Text = "已经达到上传最大数量!";
                return;
            }
        }
        if (ValidFormat(GetExtendName(fuUpload.FileName)))
        {
            ImagesData imagesTable = (ImagesData)ViewState[IMAGES_TABLE];
            if (imagesTable != null && imagesTable.Rows.Count > 0)
            {
                foreach (DataRow dr in imagesTable.Rows)
                {
                    images.Append(dr[ImagesData.URL_FIELD].ToString());
                    images.Append(":");
                    images.Append(dr[ImagesData.INFO_FIELD].ToString());
                    images.Append(";");
                }
            }
            //upload
            Random random = new Random();
            String fileName = GetFitTimeString() + random.Next().ToString() + "." + GetExtendName(fuUpload.FileName);
            string url = attachmentDir + "//" + fileName;
            string info = tbInfo.Text.Trim();
            try
            {
                fuUpload.SaveAs(Server.MapPath(url));
                num++;
                ViewState["num"] = num;
            }
            catch
            {
            }
            //the value stored to db
            images.Append(url);
            images.Append(":");
            images.Append(info);
            images.Append(";");
            ViewState["images"] = images;
            Images = images.ToString();

            tbInfo.Text = "";
            lbMessage.Text = "";
        }
    }

   protected void lbDelAttachment_Click(object sender, EventArgs e)
    {
        try
        {
            LinkButton lb = (LinkButton)sender;
            string url = lb.CommandArgument.Trim();
            StringBuilder sb = new StringBuilder();
            ImagesData imageTable = (ImagesData)ViewState[IMAGES_TABLE];
            foreach (DataRow dr in imageTable.Rows)
            {
                string rowUrl = dr[ImagesData.URL_FIELD].ToString();
                string rowInfo = dr[ImagesData.INFO_FIELD].ToString();
                if (!rowUrl.Equals(url))
                {
                    sb.Append(rowUrl).Append(":").Append(rowInfo).Append(";");                   
                }
                else
                {
                    File.Delete(Server.MapPath(url));
                }
            }
            ViewState["images"] = sb;
            Images = sb.ToString();
        }
        catch (Exception ex)
        {
            lbMessage.Text = ex.Message;
        }
    }

如有需要的朋友可以联系偶,偶可以发给你代码。浅薄之处,请指教。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值