(原)ASP.NET 2.0(C#)实现多文件上传
2006-08-27 16:40
751 查看
用户控件的使用可以大大提高程序的开发进度,同时,也使代码规范整洁,程序结构清晰。本文基于实际项目,实现了一个多文件上传的用户控件。
下面先简单描述一下控件的功能:
1、可以实现多文件上传,可控制上传数量,可以添加文件的描述;
2、可以控制上传文件的格式类型,通过设置不同的格式类型,可以实现多图片的上传、多文件的上传、多视频的上传;当然,你也可以混合上传;
3、上传的文件即可显示在列表中,可以查看图片及删除上传的图片;
控件外观如下:控件外观
![](http://blog.ccidnet.com/attachment/Mon_0608/10_689_baafc1774c43526.gif)
因项目基于分层模式,所以控件的实现也是在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;
}
}
如有需要的朋友可以联系偶,偶可以发给你代码。浅薄之处,请指教。
下面先简单描述一下控件的功能:
1、可以实现多文件上传,可控制上传数量,可以添加文件的描述;
2、可以控制上传文件的格式类型,通过设置不同的格式类型,可以实现多图片的上传、多文件的上传、多视频的上传;当然,你也可以混合上传;
3、上传的文件即可显示在列表中,可以查看图片及删除上传的图片;
控件外观如下:控件外观
![](http://blog.ccidnet.com/attachment/Mon_0608/10_689_baafc1774c43526.gif)
因项目基于分层模式,所以控件的实现也是在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;
}
}
如有需要的朋友可以联系偶,偶可以发给你代码。浅薄之处,请指教。
相关文章推荐
- ASP.NET 2.0(C#)实现多文件上传
- ASP.NET 2.0(C#)实现多文件上传
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- Asp.net 2.0 用 FileUpload 控件实现多文件上传 用户控件(示例代码下载)
- asp.net+C#实现文件上传,很方便
- asp.net,C#,html控件的File控件实现多文件上传简单实例,vs2010
- ASP.NET(C#)FileUpload实现上传限定类型和大小的文件到服务器
- Asp.net 2.0 用 FileUpload 控件实现多文件上传 用户控件
- ASP.NET(C#)实现一次性上传多张图片(多个文件)
- ASP.NET(C#)实现一次性上传多张图片(多个文件)
- c#、asp.net 基于ajaxfileupload.js 实现文件异步上传
- ASP.NET(C#)FileUpload实现上传限定类型和大小的文件到服务器
- ASP.NET(C#)实现一次性动态上传多张图片的代码(多个文件)
- C# asp.net实现文件上传
- 在ASP.NET中实现多文件上传(C#)
- ASP.NET(C#)实现一次性上传多张图片(多个文件)
- ASP.NET(C#)实现一次性上传多张图片(多个文件)
- ASP.NET(C#)实现一次性上传多张图片(多个文件)
- Asp.net 2.0 用 FileUpload 控件实现多文件上传 用户控件(示例代码下载)
- (转)ASP.NET(C#)FileUpload实现上传限定类型和大小的文件到服务器