ASP.NET 2.0(C#)实现多文件上传
用户控件的使用可以大大提高程序的开发进度,同时,也使代码规范整洁,程序结构清晰。本文基于实际项目,实现了一个多文件上传的用户控件。
下面先简单描述一下控件的功能: 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; } } |