多文件的上传、管理与下载
private void Button1_Click(object sender, System.EventArgs e)
{
string fullname=this.File1.PostedFile.FileName;
//得出全部的文件路径和名字
string vfilename=fullname.Substring(fullname.LastIndexOf("\\")+1);
//截取长文件名中最后一个\后面的字符作为文件名字
string type=vfilename.Substring(vfilename.LastIndexOf(".")+1);
//截取长文件名中最后一个.后面的字符作为文件类型
string size=Convert.ToString(this.File1.PostedFile.ContentLength);//文件大小
string type=this.File1.PostedFile.ContentType; //文件类型
if(type=="jpg"||type=="bmp"||type=="gif"||type=="png")
//如果类型等于规定的这几种就存
{
this.File1.PostedFile.SaveAs(Server.MapPath("up")+"\\"+vfilename);
//利用saveAs方法把文件存在服务器上
this.Image1.ImageUrl=Server.MapPath("up")+"\\"+vfilename;
//马上显示最近上传的图片
}
else
{
Response.Write("<Script language='javascript'>alert('图片格式错误')</script>");//否则提示用户错误
}
}
为实现以上设计,我们相应的定义四个方法。
InsertC方法;用于执行添加一个上传控件的操作。HtmlTableRow相当于html的<tr>标签,而相应的HtmlTableCell相当于html里面的<td>标签,其作用在于动态的增加一个一行一列的table,然后把控件往动态添加的table里面填充,最后写入缓存。其详细代码如下:
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();
}
SFUPC方法:该方法用于保存当前页面上传文件控件集到缓存中。首先创建一个动态数组AL,然后再把table中的上传控件依次读入AL,最后再把数组中的数据保存在session中。实现如下
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);
}
GetInfo方法:该方法用于读取缓存中存储的上传文件控件集。该方法是SFUPC方法的逆操作,即是把session中的信息重新读入数组AL,再一次填充table:
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方法:该方法用于执行文件上传操作。HttpFileCollection相当于一个容器,把文件存入再取出最后上传,写入数据库部分较为简单省略了
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 = "上传成功!";
}
管理与下载:管理和下载部分的操作也较为简单,这里只是假设这些文件是一个新闻系统发出通知的附件,那么多个附件的上传如何在通知中一一显示并一点击就下载,该功能在业务层实现似乎较麻烦繁杂,于是改为在底层实现。
通知与多个文件是一对多的关系,定义数据库的关系为一对多的关系,然后再定义视图,链接一下即可实现插入与删除的约束,即把通知的id作为外键附加在文件的数据库上。