在常见的B/S模式下企业级架构中上传文件是一个常见业务操作.在.NET 1.1版本是只有对应的客户端HTML版本的Input<Type="File">,在.NET2.0版本添加进来了服务器端的FileUpload控件.
其实考虑在设计这个控件时为了保证.NET安全机制.默认设置是文件上传的大小是2M. 当然可以通过修改系统的Web.Config配置文件达到4M. 其实相对而言Fileupload是一把双刃剑.使用时扬长避短是很重要的.
开发者应该了解的是,之所以默认的文件大小上限为4MB,并不是因为当时的设计人员灵光一现,而是为了避免潜在DOS攻击危险。若是攻击者提交了一个或多个大文件,往往会让服务器不堪重负。若是用户上传的文件大于4MB,将会得到“Maximum request length exceeded.”异常信息. 当然这些就涉及到Asp.net平台下大文件上传的问题作为下一节讨论并实现. 本章主要实现的是利用Asp.net中FileUpload控制的一些基本操作.
最近装上VS2010 Beta2版本. NET FrameWork 4.0.(关系不大)试用一下.以下的项目编码都在该环境下运行.
(A):简单文件上传操作 页面代码:
1
--前台一个上传控件 接着是一个上传按钮
2 < asp:FileUpload ID ="FileUpload5" runat ="server" Width ="475px" ></ asp:FileUpload >
3 < asp:Button ID ="TestFileType" runat ="server" Text ="上传文件-判断文件类型"
4 onclick ="TestFileType_Click" OnClientClick ="CheckFileType()" ></ asp:Button >
2 < asp:FileUpload ID ="FileUpload5" runat ="server" Width ="475px" ></ asp:FileUpload >
3 < asp:Button ID ="TestFileType" runat ="server" Text ="上传文件-判断文件类型"
4 onclick ="TestFileType_Click" OnClientClick ="CheckFileType()" ></ asp:Button >
后台Button时间操作代码:
1
//
向服务器上传文件-BasicOperatorDemo(基本操作演示) -最简单操作
2 // Author:chenkai Date:2009年11月10日14:22:36
3 protected void bt_upload_Click( object sender, EventArgs e)
4 {
5 try {
6 if (FileUpload1.PostedFile.FileName == "")
7 {
8 this.lb_info.Text = "请选择您要上传的文件!";
9 }
10 else
11 {
12 string filepath = FileUpload1.PostedFile.FileName.ToString();
13 string filename = filepath.Substring(filepath.LastIndexOf("\\") + 1);
14
15 string serverpath = HttpContext.Current.Server.MapPath("Images/") + filename;
16
17 //保存到服务器上 判断文件目录是否存在
18 if (File.Exists(serverpath))
19 {
20 FileUpload1.SaveAs(serverpath);
21 this.lb_info.Text = "文件上传成功!";
22 }
23 else
24 {
25 //创建保存目录
26 File.Create(serverpath);
27 }
28
29 }
30 }
31 catch (Exception se)
32 {
33 this.lb_info.Text = "上传过程发生错误!错误原因:" + se.ToString();
34 }
35 }
2 // Author:chenkai Date:2009年11月10日14:22:36
3 protected void bt_upload_Click( object sender, EventArgs e)
4 {
5 try {
6 if (FileUpload1.PostedFile.FileName == "")
7 {
8 this.lb_info.Text = "请选择您要上传的文件!";
9 }
10 else
11 {
12 string filepath = FileUpload1.PostedFile.FileName.ToString();
13 string filename = filepath.Substring(filepath.LastIndexOf("\\") + 1);
14
15 string serverpath = HttpContext.Current.Server.MapPath("Images/") + filename;
16
17 //保存到服务器上 判断文件目录是否存在
18 if (File.Exists(serverpath))
19 {
20 FileUpload1.SaveAs(serverpath);
21 this.lb_info.Text = "文件上传成功!";
22 }
23 else
24 {
25 //创建保存目录
26 File.Create(serverpath);
27 }
28
29 }
30 }
31 catch (Exception se)
32 {
33 this.lb_info.Text = "上传过程发生错误!错误原因:" + se.ToString();
34 }
35 }
再次逐步的提高要求: A:限制客户端上传文件的文件类型. 只能上传制定的.JPG/.Jpeg/.chm 3种类型的文件. 客户端验证模式:
1
<
Script
language
="JavaScript"
Type
="JS/Text"
>
2 //定义一个客户端JS函数来判断上传文件的类型 在Button onClintClick事件调用
3 function CheckFileType() {
4 //尽然可以直接调用服务器端控件
5 var str = document.getElementById("FileUpload5").value;
6 alert(str);
7 var pos = str.lastIndexOf(".");
8 var lastname = str.substring(pos,str.length)
9
10 if (lastname.toLowerCase()!=".jpg" && lastname.toLowerCase()!=".gif")
11 {
12 alert("您上传的文件类型为"+lastname+",图片必须为.jpg,.gif类型");
13 return false;
14 }
15 else
16 {
17 return true;
18 }
19 }
20 </ Script >
2 //定义一个客户端JS函数来判断上传文件的类型 在Button onClintClick事件调用
3 function CheckFileType() {
4 //尽然可以直接调用服务器端控件
5 var str = document.getElementById("FileUpload5").value;
6 alert(str);
7 var pos = str.lastIndexOf(".");
8 var lastname = str.substring(pos,str.length)
9
10 if (lastname.toLowerCase()!=".jpg" && lastname.toLowerCase()!=".gif")
11 {
12 alert("您上传的文件类型为"+lastname+",图片必须为.jpg,.gif类型");
13 return false;
14 }
15 else
16 {
17 return true;
18 }
19 }
20 </ Script >
上传制定文件类型服务器端验证模式:
1
/**/
/// <summary>
2 /// 检测真正的上传文件类型数据
3 /// Author:chenkai Date:2009年11月11日10:44:26
4 /// </summary>
5 public bool CheckClintFileType(FileUpload getfile)
6 {
7 //获得数据
8 System.IO.FileStream getstream=new FileStream(getfile.FileName,FileMode.Open,FileAccess.Read);
9 System.IO.BinaryReader getreader = new BinaryReader(getstream);
10
11 string fileclass = string.Empty;
12 byte buffer;
13
14 try
15 {
16 //读取的文件流转化成二进制文件
17 buffer = getreader.ReadByte();
18 fileclass = buffer.ToString();
19 //再次叠加
20
2 /// 检测真正的上传文件类型数据
3 /// Author:chenkai Date:2009年11月11日10:44:26
4 /// </summary>
5 public bool CheckClintFileType(FileUpload getfile)
6 {
7 //获得数据
8 System.IO.FileStream getstream=new FileStream(getfile.FileName,FileMode.Open,FileAccess.Read);
9 System.IO.BinaryReader getreader = new BinaryReader(getstream);
10
11 string fileclass = string.Empty;
12 byte buffer;
13
14 try
15 {
16 //读取的文件流转化成二进制文件
17 buffer = getreader.ReadByte();
18 fileclass = buffer.ToString();
19 //再次叠加
20