说明
以前的Web程序应用中,要实现多文件上传是很麻烦的事,但这一操作在Web应用程序中会经常用到,可以说是必不可少的,因此令开发人员非常头痛。现在有了ASP.NET,多文件上传也就不再困难了。本实例实现了多文件上传的功能,不仅可以动态添加上传控件,上传的文件数量也不受任何限制。如图1所示,单击“添加文件”按钮,上传控件会随着单击次数而不断地增加,用户在每个上传控件中选择了要上传的文件后,单击“上传文件”按钮即可实现多文件上传操作。
关键技术
本实例首先通过System.Collections命名空间的ArrayList类存储生成的临时控件,然后应用FileUpload类中的SaveAs方法将文件保存到服务器指定路径中。
设计过程
(1)新建一个网站,将其命名为MultiFileUpload,默认主页为Default.aspx.。
(2)在该页中添加1个Table表格、1个FileUpload控件、2个Button控件和1个Label控件,分别用于页面布局、选择上传文件、执行上传操作、添加上传控件和执行状态提示。
(3)设置首次打开页面时调用SFUPC( )方法,每执行一次就向缓存中添加一个FileUpload控件,代码如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)//首次执行页面
{
SFUPC( );
}
}
触发“上传文件”按钮的Click事件,在该事件中调用UpFile( )方法执行文件上传操作,代码如下:
protected void Button1_Click(object sender, EventArgs e)
{
UpFile( ); //执行上传文件
}
触发“添加文件”按钮的Click事件,在该事件中调用InsertC( )方法执行添加上传控件的操作,代码如下:
protected void Button2_Click(object sender, EventArgs e)
{
InsertC( );//执行添加控件方法
}
定义一个方法SFUPC( ),该方法用于保存当前页面上传文件控件集到缓存中,代码如下:
private void SFUPC( )
{
ArrayList AL = new ArrayList( ); //创建动态增加数组
foreach (Control C in F.Controls)
{
if (C.GetType( ).ToString( ) == "System.Web.UI.HtmlControls.HtmlTableRow")
{
HtmlTableCell HTC = (HtmlTableCell)C.Controls[0];
foreach (Control FUC in HTC.Controls)
{
if (FUC.GetType( ).ToString( ) == "System.Web.UI.WebControls.FileUpload")
{
FileUpload FU = (FileUpload)FUC;
AL.Add(FU);
}
}
}
}
Session.Add("FilesControls", AL);
}
定义一个方法InsertC( ),该方法用于添加一个上传文件的控件,代码如下:
private void InsertC( ) //该方法用于添加一个上传文件的控件
{
ArrayList AL = new ArrayList( );
this.F.Rows.Clear( );
GetInfo( );
HtmlTableRow HTR = new HtmlTableRow( );
HtmlTableCell HTC = new HtmlTableCell( );
HTC.Controls.Add(new FileUpload( ));
HTR.Controls.Add(HTC);
F.Rows.Add(HTR);
SFUPC( );
}
定义一个方法GetInfo( ),该方法用于读取缓存中存储的上传文件控件集,代码如下:
private void GetInfo( ) //该方法用于读取缓存中存储的上传文件控件集
{
ArrayList AL = new ArrayList( );
if (Session["FilesControls"] != null)
{
AL = (System.Collections.ArrayList)Session["FilesControls"];
for (int i = 0; i < AL.Count; i++)
{
HtmlTableRow HTR = new HtmlTableRow( );
HtmlTableCell HTC = new HtmlTableCell( );
HTC.Controls.Add((System.Web.UI.WebControls.FileUpload)AL[i]);
HTR.Controls.Add(HTC);
F.Rows.Add(HTR);
}
}
}
定义一个方法UpFile( ),该方法用于执行文件上传操作,代码如下:
private void UpFile( ) //该方法用于执行文件上传操作
{
string FilePath = Server.MapPath("./") + "File";
HttpFileCollection HFC = Request.Files;
for (int i = 0; i < HFC.Count; i++)
{
HttpPostedFile UserHPF = HFC[i];
try
{
if (UserHPF.ContentLength >= 0)
{
UserHPF.SaveAs(FilePath + "\\" + System.IO.Path.GetFileName(UserHPF.FileName));
}
}
catch
{
Label1.Text = "处理出错!";
}
}
if (Session["FilesControls"] != null)
{
Session.Remove("FilesControls");
}
Label1.Text = "上传成功!";
}
注意:使用JQuery的uploadify插件能够实现带进度提示的多文件上传功能。jQuery是一个优秀的Javascrīpt框架,uploadify插件是一个基于Flash技术的文件上传jQuery插件。提供的功能包括:能够一次性选择多个文件上传,查看上传进度,控制文件上传类型和大小,为每一步操作添加回调函数等。在ASP.NET中可以使用“一般处理程序(ashx)”文件作为服务器端处理上传的文件。