文件上传和下载(一)
时间:2010-09-19 来源:czyhsl
快下班了,今天下午做了一个上传、下载文件的程序。对于常见格式的文件基本上都可以上传、下载,但由于使用Session来保存对象,所以上传文件大小不能超过4M。
这里面包含:3个Button控件、一个FileUpload控件、一个Label控件。当点击添加文件时,就增加一个FileUpload控件,这样可以一次性上传多个文件,另外两个按钮一个就是上传,一个是下载。
当点击第一个图片中的下载文件按钮时,进入到另一个页面(图2),点击上传文件则返回到第一个页面(图1)。前期的准备工作已经完成,要做的任务也比较明确了,接下来具体讲解下功能实现,页面设计可以自己动手实践下。
首先看下添加文件的实现
protected void ImageButtonAdd_Click(object sender, ImageClickEventArgs e)代码
{
InsertControl();//执行添加控件方法
lblMessage.Text = "";
}
//该方法用于添加一个上传文件的控件代码
private void InsertControl()
{
//实例化ArrayList
ArrayList AL = new ArrayList();
this.F.Rows.Clear(); //清除id为F表格里的所有行
GetInfo();
//表示 HtmlTable 控件中的 <tr> HTML 元素
HtmlTableRow HTR = new HtmlTableRow();
//表示 HtmlTableRow 对象中的 <td> 和 <th> HTML 元素
HtmlTableCell HTC = new HtmlTableCell();
//在单元格中添加一个FileUpload控件
HTC.Controls.Add(new FileUpload());
//在行中添加单元格
HTR.Controls.Add(HTC);
//在表中添加行
F.Rows.Add(HTR);
SFUPC();
}
//该方法用于当前页面上传文件控件集保存到Session中代码
private void SFUPC()
{
ArrayList AL = new ArrayList();//创建动态增加数组
foreach (Control C in F.Controls)
{
//在表格中查找出FileUpload控件添加到ArrayList中
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;
//添加FileUpload控件
AL.Add(FU);
}
}
}
}
//把ArrayList添加到Session中
Session.Add("FilesControls", AL);
}
//该方法用于将保存在Session中的上传文件控件集添加到表格中
private void GetInfo()
{
ArrayList AL = new ArrayList();
if (Session["FilesControls"] != null)
{
AL = (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);
}
}
}
然后看下上传文件的实现
代码
protected void ImageButtonUp_Click(object sender, ImageClickEventArgs e)代码
{
if (this.fileup.PostedFile.FileName != "")
{
UpFile();//执行上传文件
SFUPC();
}
else
{
Response.Write("<script>alert('上传文件不能为空!');location=Default.aspx</script>");
}
}
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
{
lblMessage.Text = "上传失败!";
}
}
if (Session["FilesControls"] != null)
{
Session.Remove("FilesControls");
}
lblMessage.Text = "上传成功!";
}
具体的方法调用,可以查看上面代码中的方法。
最后就是下载文件的实现
在首次加载页面时,把所有文件放入到ListBox中
代码
protected void bindListBox()
{
//将指定文件夹中的文件保存到字符串数组中
string[] name = Directory.GetFiles(Server.MapPath("File"));
foreach (string s in name)
{
//将文件名添加到ListBox中
listfile.Items.Add(Path.GetFileName(s));
}
}
当点击文件名时应该触发SelectedIndexChanged事件
protected void listfile_SelectedIndexChanged(object sender, EventArgs e)
{
Session["file"] = listfile.SelectedValue.ToString();
}
现在终于到下载文件啦!
protected void ImgBtnDown_Click(object sender, ImageClickEventArgs e)代码
{
DownFile();
}
protected void DownFile()
{
//判断是否选择文件名
if (listfile.SelectedValue != "")
{
if (Session["file"] != "")
{ //获取文件路径
string path = Server.MapPath("File/") + Session["file"].ToString();
//初始化 FileInfo 类的实例,它作为文件路径的包装
FileInfo fi = new FileInfo(path);
//判断文件是否存在
if (fi.Exists)
{
//将文件保存到本机上
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(fi.Name));
Response.AddHeader("Content-Length", fi.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.Filter.Close();
Response.WriteFile(fi.FullName);
Response.End();
}
}
}
else
{
Page.RegisterStartupScript("", "<script>alert('请先选择文件名!')</script>");
}
}
快下班了,写的有点仓促。代码中控件的名称基本上都很容易看明白,最主要的是要好好分析下其中的几个方法。一天就这么过去了,幸运地是我今天留下了三篇随笔!我相信明天...呵呵
相关阅读 更多 +