一聚教程网:一个值得你收藏的教程网站

热门教程

Asp.Net中FileUpload实现文件上传示例

时间:2022-06-25 03:41:18 编辑:袖梨 来源:一聚教程网

属性:
FileName: 获取上传的文件名

HasFile: 是否选择(存在)上传的文件

ContentLength: 获得上窜文件的大小,单位是字节(byte)
 
方法:
Server.MapPath(): 获取服务器上的物理路径

SaveAs(): 保存文件到指定的文件夹
 
注意:默认情况下限制上传文件大小为4MB,通过web.config.comments(这个设置是全局的配置)可以修改其默认设置
或者通过修改web.config文件来改变应用程序上传限制.
 
如:
1
<httpRuntime maxRequestLength="10240" executionTimeout="150" enable="true"/>
元素解释:
maxRequestLength: 设置上传文件大小,单位是kb.
 
executionTimeout: 允许执行请求的最大秒数,此功能必须在Compilation元素中Debug属性为false时才生效.
 
enable: 指定是否在当前的节点及子节点级别启用应用程序域 (AppDomain),以接受传入的请求。如果为 False,则实际上关闭了该应用程序。默认值为 True.
通俗的说就是:是否允许用户访问该网站(是否允许Http请求)
 
注意:如果上传文件超过maxRequestLength大小,会出现页面无法显示的情况.
如:
Asp.Net中FileUpload实现文件上传示例
检查文件上传类型:
1).客户端检查(javascript实现)

2).服务器端检查
 
示例:
界面参考:

Asp.Net中FileUpload实现文件上传示例

 代码如下 复制代码

 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         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;    
    }

热门栏目