• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ASP.NET2.0(C#)实现多文件上传

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
用户控件的使用可以大大提高程序的开发进度,同时,也使代码规范整洁,程序结构清晰。本文基于实际项目,实现了一个多文件上传的用户控件。
下面先简单描述一下控件的功能:
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人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap