2.6 在ASP.NET中实现文件上传
学习目标
熟悉在ASP.NET中使用FileUpload Web服务器控件实现文件上传的使用方法。
本节示例代码参考:/Code/ch02/StudyFileUpload。
2.6.1 FileUpload Web服务器控件概述
当前,基于浏览器/服务器模式的应用比较流行。当用户需要将文件传输到服务器上时,常用方法之一是FTP,这种解决方案仅对熟悉FTP且富有经验的用户来说是可行的。
如果能把文件上传功能与Web集成,使用户仅用Web浏览器就能完成上传任务,这对于用户来说将是非常方便的。在ASP.NET中通常是使用FileUpload Web服务器控件来完成的。
使用FileUpload控件,可以为用户提供一种将文件从其计算机发送到服务器的方法。FileUpload控件使用户能够上传图片、文本文件或其他文件。FileUpload控件显示一个文本框,在此用户可以输入希望上传到服务器的文件的名称。该控件还显示一个“浏览”按钮,该按钮显示一个文件导航对话框(显示的对话框取决于用户计算机的操作系统)。出于安全方面的考虑,不能将文件名预加载到FileUpload控件中。
当用户已选定要上传的文件并提交页时,该文件将作为请求的一部分上传。文件将被完整地缓存在服务器内存中。文件完成上传后,页代码开始运行。
可以通过PostedFile对象公开的一些属性,如ContentType和ContentLength属性等来处理用户上传文件的信息。对所上传文件的保存位置,没有固有限制。但是,若要保存文件,ASP.NET进程必须具有在指定位置创建文件的权限,并在保存上传文件时必须提供绝对路径(一般都是使用Server.MapPath方法即可)。
2.6.2 简单文件上传
(1)新建ASP.NET网站项目StudyFileUpload,删除默认Default.aspx页面,添加页面StudyFileUpload001.aspx,并在工具箱中的“标准”选项卡中选择一个FileUpload控件和一个按钮控件、一个Image控件添加到页面,布局页面如图2-109所示,并在该项目根目录下创建一个保存上传文件的文件夹,如“Uploadfiles”。
(2)在图2-109中直接双击“上传”按钮进入该按钮的单击事件编写窗口,编写上传的处理代码。
protected void btnUpload_Click(object sender, EventArgs e) { FileUpload1.PostedFile.SaveAs(Server.MapPath("Uploadfiles/1. jpg")); Image1.ImageUrl = "Uploadfiles/1.jpg";
}
(3)按Ctrl+F5组合键,运行显示效果如图2-110所示。
(4)单击图2-110中的“浏览”按钮选择一个要上传的图片文件,然后单击“上传”按钮,显示效果如图2-111所示,表示文件已经上传成功了。
2.6.3 受限制的文件上传
上面的文件上传没有任何限制,包括类型、大小、文件名重命名等,这在Web应用环境中显然是不能使用的,接下来就讲解如何限制上传文件的类型、大小以及文件名重命名功能。
比如限制文件上传的类型只能为.jpg,.gif,最大不能超过300KB,上传文件的名称使用当前日期的字符串和一个随机数构造,接下来讲解实现方法。
(1)在网站项目StudyFileUpload添加页面StudyFileUpload002.aspx,并布局页面如图2-109所示,并在该项目根目录下创建一个保存上传文件的文件夹例如“Uploadfiles”(如已经存在不用再创建)。
(2)首先编写一个函数用于生成新文件名,函数名称为GetFilename(),完整代码如下。
private string GetFilename() { Random rnd = new Random(); int a = 1000; int b = 9999; string str = string.Empty; //Year str += DateTime.Now.Year.ToString(); //Month if (DateTime.Now.Month < 10) { str += "0" + DateTime.Now.Month.ToString(); } else { str += DateTime.Now.Month.ToString(); } //Day if (DateTime.Now.Day < 10) { str += "0" + DateTime.Now.Day.ToString(); } else { str += DateTime.Now.Day.ToString(); } //Hour if (DateTime.Now.Hour < 10) { str += "0" + DateTime.Now.Hour.ToString(); } else { str += DateTime.Now.Hour.ToString(); } //Minute if (DateTime.Now.Minute < 10) { str += "0" + DateTime.Now.Minute.ToString(); } else { str += DateTime.Now.Minute.ToString(); } //Second if (DateTime.Now.Second < 10) { str += "0" + DateTime.Now.Second.ToString(); } else { str += DateTime.Now.Second.ToString(); } //获取[a,b]之间的随机数 str += rnd.Next(a, b).ToString(); return str; }
(3)在图2-109中双击“上传”按钮进入该按钮的代码编写窗口,在其中编写如下代码。
protected void btnUpload_Click(object sender, EventArgs e) { //获取上传文件在客户端的路径和名称比如E:\Photo\gif\50093.gif string Filename = FileUpload1.PostedFile.FileName; //获取上传文件的大小单位为字节byte int Filesize = FileUpload1.PostedFile.ContentLength; //获取上传文件的扩展名比如.gif string Txt = Filename.Substring(Filename.LastIndexOf(".")).ToLower(); //定义上传文件的最大空间大小300kb int Maxsize = 300 * 1024; //定义上传文件的类型字符串 string Filetype = ".gif,.jpg"; //构造新文件路径和名称 string NewFilename = "Uploadfiles/" + GetFilename() + Txt; if (Filetype.Contains(Txt)) { //表示类型正确 if (Filesize <= Maxsize) { FileUpload1.PostedFile.SaveAs(Server.MapPath (NewFilename));Response.Write(NewFilename +“上传 成功,大小为:”+ Convert.ToInt32(Filesize / 1024). ToString() + "KB"); Image1.ImageUrl = NewFilename; } else { Response.Write(“文件太大”); } } else { //表示类型错误 Response.Write(“类型选择错误”); Response.End(); } }
(4)按Ctrl+F5组合键,运行显示效果如图2-112所示。
(5)在图2-112中如果选择.gif,.jpg以外类型的文件后单击“上传”按钮,显示效果如图2-113所示。
(6)如果选择超过300KB的文件则会给出“文件太大”的错误提示,而如果正常选择上传文件后单击“上传”按钮,显示如图2-114所示。