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