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

属性:
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大小,会出现页面无法显示的情况.

如:

检查文件上传类型:
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;    
    }

时间: 2024-10-03 08:23:33

Asp.Net中FileUpload实现文件上传示例的相关文章

ASP.NET中常用的文件上传下载方法

asp.net|上传|下载     文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括:1.如何解决文件上传大小的限制2.以文件形式保存到服务器3.转换成二进制字节流保存到数据库以及下载方法4.上传Internet上的资源 第一部分:    首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文件来自定义最大文件大小,如下:<

Asp.net中FileUpload控件上传文件例子

 代码如下 复制代码 /// <summary>使用FileUpload控件上传文件</summary>          /// <param name="page">this</param>          /// <param name="path">文件保存目录,相对路径示例:"~/UploadFile",绝对路径示例:"E:UploadFile",提示:w

asp.net中Fine Uploader文件上传组件使用介绍_实用技巧

最近在处理后台数据时需要实现文件上传.考虑到对浏览器适配上采用Fine Uploader. Fine Uploader 采用ajax方式实现对文件上传.同时在浏览器中直接支持文件拖拽[对浏览器版本有要求类似IE版本必须是9或是更高的IE10].在不同浏览器中提供统一用户体验.该组件基本覆盖目前所有主流浏览器.同时没有任何第三方组件依赖.相当Clear.在服务器端已经覆盖支持了ASP.NET/ColdFusion/Java/Node.js/Perl/PHP/Python. 对上传细节类似限制文件大

asp.net中Silverlight实现文件上传与下载

文件下载通常采用附件的方式在http响应头里面设置Content-disposition值为"attachment;filename=" + filepath,以及为Content-Length设置下载文件总长度(单位字节)来实现. 本文是采用Silverlight实现文件下载,服务端用asp.net一般处理程序(.ashx)处理. 以下是项目结构图: MainPage类源码如下:  代码如下 复制代码 View Code  namespace SilverlightDownAndUp

在ASP.NET中实现多文件上传的方法_实用技巧

在以前的Web应用中,上传文件是个很麻烦的事,现在有了.NET,文件上传变得轻而易举.下面的这个例子实现了多文件上传功能.可以动态添加输入表单,上传的文件数量没有限制.代码如下: MultiUpload.aspx <%@ Page Language="vb" AutoEventWireup="false" Codebehind="MultiUpload.aspx.vb"  Inherits="aspxWeb.MultiUpload

在ASP.NET中实现多文件上传

asp.net|上传 private Boolean SaveFiles() { //得到File表单元素 HttpFileCollection files = HttpContext.Current.Request.Files; try { for(int intCount= 0; intCount< files.Count; intCount++) { HttpPostedFile postedFile = files[intCount]; string fileName, fileExte

ASP.NET 2.0 多文件上传小经验

asp.net|上传     想实现任意多个文件上传的功能,点击一次按钮可以添加一个文件上传框,以前在网络硬盘上看到过.JavaScript我知道怎么实现任意添加上传文件控件,问题是添加的是Html控件,我不懂怎么让服务器端可以获取文件.     于是上google搜索"ASP.NET 多文件上传",还真找到一篇文件,标题为<在ASP.NET中实现多文件上传>,文章里面是VB.NET实现的,功能和我要的一模一样,我主要是要看服务器端怎么获取客户端上传的文件,看了文中的代码,

Asp.Net的FileUpload类实现上传文件实例_实用技巧

本文实例讲述了Asp.Net的FileUpload类实现上传文件的方法.分享给大家供大家参考. 具体功能代码如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Text; using System.Web.UI; using System.Web; using System.Web.UI.WebControls; using System.Collections; using System.Dra

java中struts2实现文件上传下载功能实例解析_java

本文实例讲述了java中struts2实现文件上传下载功能实现方法.分享给大家供大家参考.具体分析如下: 1.文件上传 首先是jsp页面的代码 在jsp页面中定义一个上传标签   复制代码 代码如下: <tr>      <td align="right" bgcolor="#F5F8F9"><b>附件:</b></td>      <td bgcolor="#FFFFFF">