属性:
FileName: 获取上传的文件名
HasFile: 是否选择(存在)上传的文件
ContentLength: 获得上窜文件的大小,单位是字节(byte)
方法:
Server.MapPath(): 获取服务器上的物理路径
SaveAs(): 保存文件到指定的文件夹
注意:默认情况下限制上传文件大小为4MB,通过web.config.comments(这个设置是全局的配置)可以修改其默认设置
或者通过修改web.config文件来改变应用程序上传限制.
如:
1 |
|
元素解释:
maxRequestLength: 设置上传文件大小,单位是kb.
executionTimeout: 允许执行请求的最大秒数,此功能必须在Compilation元素中Debug属性为false时才生效.
enable: 指定是否在当前的节点及子节点级别启用应用程序域 (AppDomain),以接受传入的请求。如果为 False,则实际上关闭了该应用程序。默认值为 True.
通俗的说就是:是否允许用户访问该网站(是否允许Http请求)
注意:如果上传文件超过maxRequestLength大小,会出现页面无法显示的情况.
如:
检查文件上传类型:
1).客户端检查(javascript实现)
2).服务器端检查
示例:
界面参考:
代码如下 | 复制代码 |
function checkType(){ //得到上传文件的值 var fileName=document.getElementById("FileUpLoad1").value; //返回String对象中子字符串最后出现的位置. var seat=fileName.lastIndexOf("."); //返回位于String对象中指定位置的子字符串并转换为小写. var extension=fileName.substring(seat).toLowerCase(); //判断允许上传的文件格式 //if(extension!=".jpg"&&extension!=".jpeg"&&extension!=".gif"&&extension!=".png"&&extension!=".bmp"){ //alert("不支持"+extension+"文件的上传!"); //return false; //}else{ //return true; //} var allowed=[".jpg",".gif",".png",".bmp",".jpeg"]; for(var i=0;i<allowed.length;i++){ if(!(allowed[i]!=extension)){ return true; } } alert("不支持"+extension+"格式"); return false; } |
.aspx.cs:
代码如下 | 复制代码 |
//文件上传按钮click事件 protected void btnFileUpload_Click(object sender, EventArgs e) { if (FileUpLoad1.HasFile) { //判断文件是否小于10Mb if (FileUpLoad1.PostedFile.ContentLength < 10485760) { try { //上传文件并指定上传目录的路径 FileUpLoad1.PostedFile.SaveAs(Server.MapPath("~/Files/") + FileUpLoad1.FileName); /*注意->这里为什么不是:FileUpLoad1.PostedFile.FileName * 而是:FileUpLoad1.FileName? * 前者是获得客户端完整限定(客户端完整路径)名称 * 后者FileUpLoad1.FileName只获得文件名. */ //当然上传语句也可以这样写(貌似废话): //FileUpLoad1.SaveAs(@"D:"+FileUpLoad1.FileName); lblMessage.Text = "上传成功!"; } catch (Exception ex) { lblMessage.Text = "出现异常,无法上传!"; //lblMessage.Text += ex.Message; } } else { lblMessage.Text = "上传文件不能大于10MB!"; } } else { lblMessage.Text = "尚未选择文件!"; } } |
服务器端检查两种方式:
1.检查文件的扩展名.
2.读取文件的二进制.
检查文件的扩展名:
代码如下 | 复制代码 |
//判断是否有上传文件 if (FileUpload1.HasFile) { //截取要上传文件的扩展名 //string extension = FileUpload1.FileName .Substring(FileUpload1.FileName.LastIndexOf(".")).ToLower(); string extension = System.IO.Path .GetExtension(FileUpload1.FileName).ToLower(); //上传文件是否大于10MB if (FileUpload1.PostedFile.ContentLength < 10485760) { //设置支持上传的文件格式 string[] allowedextension = { ".jpg", ".gif", ".jpeg", ".bmp", ".png" }; for (int i = 0; i < allowedextension.Length; i++) { //判断上传文件扩展名是否正确 if (!(extension != allowedextension[i])) { try { //上传文件 FileUpload1.PostedFile.SaveAs(Server.MapPath("~/Files/")+ FileUpload1.FileName); lblMessage.Text = "文件上传成功!"; break; } catch (Exception ex) { lblMessage.Text = "出现错误,无法上传!"; } } else { lblMessage.Text = "不支持" + extension + "格式的文件!"; } } } else { lblMessage.Text = "上传文件大小不能超过10MB!"; } } else { lblMessage.Text = "不存在上传文件!"; } |
以上例子做法的弊端,假设上传文件是.wma文件,把扩展名改成.jpg文件那么将不能被识别,依然能够上传.
解决方法:通过读取文件的二进制,每种文件的二进制前面两个字节都是不一样的,不同的文件扩展名它的
二进制前面两个字节是不同的.我们可以通过这种方式来检测文件的扩展名.如:.jpg文件前两个字节是:255216
.gif文件前两个字节是:7173,6677是BMP,13780是PNG;7790是exe,8297是rar.
上传文件名相同,文件将被覆盖,我们要对文件名的唯一性处理该怎么办呢?
上传文件名唯一性的处理:
1.利用时间戳
2.利用GUID(全局统一标识符)
读取文件的二进制并且对文件名的唯一性做处理:
代码如下 | 复制代码 |
protected void btnUpLoad_Click(object sender, EventArgs e) { if (FileUpload1.HasFile) { //判断文件大小是否大于10MB if (FileUpload1.PostedFile.ContentLength < 10485760) { if (CheckFileType()) { try { /*使用时间戳精确到毫秒,SessionID,上传文件大小, 5位随机数,来做上传文件名唯一性的处理*/ /* Random rd = new Random(); String fileName = DateTime.Now.ToString("yyyyMMddhhmmssfff")+ rd.Next(10000,99999)+ Session.SessionID + FileUpload1.PostedFile.ContentLength + System.IO.Path.GetExtension(FileUpload1.FileName);*/ /*如果使用时间戳还觉得不够保险,需要绝对唯一 *那么可以使用GUID(全局的唯一标示符):*/ string fileName = Guid.NewGuid().ToString() + System.IO.Path.GetExtension(FileUpload1.FileName); FileUpload1.PostedFile.SaveAs(Server.MapPath("~/Files/") + fileName); lblMessage.Text = "上传文件成功!"; } catch (Exception) { lblMessage.Text = "出现异常无法上传!"; } } else { lblMessage.Text = "不支持此文件格式!"; } } else { lblMessage.Text = "文件大小不能超过10MB"; } } else { lblMessage.Text = "文件不存在,请选择文件!"; } } //通过读取文件二进制的前两个字节判断文件的类型 private bool CheckFileType() { //得到客户端文件的绝对路径 String file=FileUpload1.PostedFile.FileName; //创建文件流. System.IO.FileStream fs = new System.IO.FileStream(file,System.IO.FileMode.Open,System.IO.FileAccess.Read); //创建读取文件二进制的对象 System.IO.BinaryReader br=new System.IO.BinaryReader(fs); string fileType=String.Empty; //读取文件的第一个字节,并将读取位置提升一个字节. fileType = br.ReadByte().ToString(); //读取第二个字节,并将读取位置提升一个字节. fileType += br.ReadByte().ToString(); /*如果不知道文件的二进制前两个字节,可以将它打印出来: * Response.Write(fileBinary); */ //允许上传文件的扩展名 String[] allowtedExtension = {"255216", "7173", "6677"}; //判断是否允许上传的文件类型 foreach (string allowEx in allowtedExtension) { if (!(allowEx != fileType)) { return true; } } return false; } |