• 上传大文件&验证码


    c#如何上传大文件?

    想要想上传大文件,必须在web.config文件中进行配置。

    在<system.web>节点中添加如下代码即可:

    <httpRuntime maxRequestLength="2097151"/>

    这个代码就是表示设置最大请求值,上传文件也就相当于请求。maxRequestLength单位为KB,最大值为:209715

    如果不设置,默认为4096 KB (4 MB)。

    也就是说上传的文件最大可以上传2G以内的文件。

    一般没有配置的话,默认只能上传4M以内的文件。配置了的话就可以上传更大的文件。

    c#上传大文件几种常见的方法:
      
      第一部分:首先我们来说一下如何解决ASP.net中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改Web.Config文件来自定义最大文件大小,如下:

      这样上传文件的最大值就变成了4M,但这样并不能让我们无限的扩大 MaxRequestLength的值,因为ASP.NET会将全部文件载入内存后,再加以处理。解决的方法是利用隐含的 HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASP.NET 建立的pipe里分块读取数据。实现方法如下:

    IServiceProvidERProvider=(IServiceProvider)HttpContext.Current; 
    HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest)); 
    byte[]bs=wr.GetPreloadedEntityBody(); 
    if(!wr.IsEntireEntityBodyIsPreloaded()) 
    { 
     intn=1024; 
     byte[]bs2=newbyte[n]; 
     while(wr.ReadEntityBody(bs2,n)>0) 
     { 
      .. 
     } 
    }   
    这样就可以解决了大文件的上传问题了。

      第二部分:下面我们来介绍如何以文件形式将客户端的一个文件上传到服务器并返回上传文件的一些基本信息。

      首先我们定义一个类,用来存储上传的文件的信息(返回时需要)。

    public class FileUpLoad 
    { 
     public FileUpLoad() 
     {} 
     /// 上传文件名称 
     public string FileName 
     { 
      get 
      { 
       return fileName; 
      } 
      set 
      { 
       fileName = value; 
      } 
     } 
     private string fileName;
     /// 上传文件路径 
     public string FilePath 
     { 
      get 
      { 
       return filepath; 
      } 
      set 
      { 
       filepath = value; 
      } 
     } 
     private string filepath;

     /// 文件扩展名 
     public string FileExtension 
     { 
      get 
      { 
       return fileExtension; 
      } 
      set 
      { 
       fileExtension = value; 
      } 
     } 
     private string fileExtension; 
    }   

    另外我们还可以在配置文件中限制上传文件的格式(App.Config):
    <?XML version="1.0" encoding="gb2312" ?> 
    <Application> 
    <FileUpLoad>
    <Format>.jpg|.gif|.png|.bmp 
    </FileUpLoad> 
    </Application>  这样我们就可以开始写我们的上传文件的方法了,如下: public FileUpLoad UpLoadFile(HtmlInputFile InputFile,string filePath,string myfileName,bool isRandom) 
    { 
     FileUpLoad fp = new FileUpLoad(); 
     string fileName,fileExtension; 
     string saveName;
     //建立上传对象 
     HttpPostedFile postedFile = InputFile.PostedFile;

     fileName = System.IO.Path.GetFileName(postedFile.FileName); 
     fileExtension = System.IO.Path.GetExtension(fileName);
     //根据类型确定文件格式 
     AppConfig app = new AppConfig(); 
     string format = app.GetPath("FileUpLoad/Format");
     //如果格式都不符合则返回 
     if(format.IndexOf(fileExtension)==-1) 
     { 
      throw new ApplicationException("上传数据格式不合法"); 
     }

     // 
     //根据日期和随机数生成随机的文件名 
     // 
     if(myfileName != string.Empty) 
     { 
      fileName = myfileName; 
     }

     if(isRandom) 
     { 
      Random objRand = new Random(); 
      System.DateTime date = DateTime.Now; 
      //生成随机文件名 
      saveName = date.Year.ToString() + date.Month.ToString() + date.Day.ToString() + date.Hour.ToString() + date.Minute.ToString() + date.Second.ToString() + Convert.ToString(objRand.Next(99)*97 + 100); 
      fileName = saveName + fileExtension; 
     }

     string phyPath = HttpContext.Current.Request.MapPath(filePath);

     //判断路径是否存在,若不存在则创建路径 
     DirectoryInfo upDir = new DirectoryInfo(phyPath); 
     if(!upDir.Exists) 
     { 
      upDir.Create(); 
     }
     //保存文件 
     try 
     { 
      postedFile.SaveAs(phyPath + fileName);

      fp.FilePath = filePath + fileName; 
      fp.FileExtension = fileExtension; 
      fp.FileName = fileName; 
     } 
     catch 
     { 
      throw new ApplicationException("上传失败!"); 
     }

     //返回上传文件的信息 
     return fp; 
    }   

    然后我们在上传文件的时候就可以调用这个方法了,将返回的文件信息保存到数据库中,至于下载,就直接打开那个路径就OK了。

      第三部分:这里我们主要说一下如何以二进制的形式上传文件以及下载。首先说上传,方法如下:

    public byte[] UpLoadFile(HtmlInputFile f_IFile) 
    { 
     //获取由客户端指定的上传文件的访问 
     HttpPostedFile upFile=f_IFile.PostedFile; 
     //得到上传文件的长度 
     int upFileLength=upFile.ContentLength; 
     //得到上传文件的客户端MIME类型 
     string contentType = upFile.ContentType; 
     byte[] FileArray=new Byte[upFileLength];

     Stream fileStream=upFile.InputStream;

     fileStream.Read(FileArray,0,upFileLength); 
     return FileArray; 
    }   

    这个方法返回的就是上传的文件的二进制字节流,这样我们就可以将它保存到数据库了。下面说一下这种形式的下载,也许你会想到这种方式的下载就是新建一个 aspx页面,然后在它的Page_Load()事件里取出二进制字节流,然后再读出来就可以了,其实这种方法是不可取的,在实际的运用中也许会出现无法打开某站点的错误,我一般采用下面的方法:

      首先,在Web.config中加入: <add verb="*" path="openfile.aspx" type="RuixinOA.Web.BaseClass.OpenFile, RuixinOA.Web"/>  这表示我打开openfile.aspx这个页面时,系统就会自动转到执行RuixinOA.Web.BaseClass.OpenFile 这个类里的方法,具体实现如下:

    using System; 
    using System.Data; 
    using System.Web; 
    using System.IO; 
    using Ruixin.WorkFlowDB; 
    using RXSuite.Base; 
    using RXSuite.Component; 
    using RuixinOA.BusinessFacade;

    namespace RuixinOA.Web.BaseClass 
    { 
     public class OpenFile : IHttpHandler 
     { 
      public void ProcessRequest(HttpContext context) 
      { 
       //从数据库中取出要下载的文件信息 
       RuixinOA.BusinessFacade.RX_OA_FileManager os = new RX_OA_FileManager(); 
       EntityData data = os.GetFileDetail(id);

       if(data != null && data.Tables["RX_OA_File"].Rows.Count >0) 
       { 
        DataRow dr = (DataRow)data.Tables["RX_OA_File"].Rows[0]; 
        context.Response.Buffer = true; 
        context.Response.Clear(); 
        context.Response.ContentType = dr["CContentType"].ToString(); 
        context.Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(dr["CTitle"].ToString())); 
        context.Response.BinaryWrite((Byte[])dr["CContent"]); 
        context.Response.Flush(); 
        context.Response.End(); 
       } 
      } 
      public bool IsReusable 
      {   
       get { return true;} 
      } 
     } 
    }   

    执行上面的方法后,系统会提示用户选择直接打开还是下载。这一部分我们就说到这里。

      第四部分:这一部分主要说如何上传一个Internet上的资源到服务器。

    首先需要引用 System.Net 这个命名空间,然后操作如下: HttpWebRequest hwq = (HttpWebRequest)WebRequest.Create("http://localhost/pwtest/webform1.aspx"); 
    HttpWebResponse hwr = (HttpWebResponse)hwq.GetResponse(); 
    byte[] bytes = new byte[hwr.ContentLength]; 
    Stream stream = hwr.GetResponseStream(); 
    stream.Read(bytes,0,Convert.ToInt32(hwr.ContentLength)); 
    //HttpContext.Current.Response.BinaryWrite(bytes);

    HttpWebRequest 可以从Internet上读取文件,因此可以很好的解决这个问题。

  • 相关阅读:
    5 float f = 3.4,是否正确
    4 String是基本数据类型吗
    3 访问修饰符public,private,protected以及不写(默认)时的区别
    1 请谈谈面向对象的三大特征?
    接口和抽象类有什么区别
    2 Java中 == 和 equals 和 hashCode 的区别
    java中重载(overload)与重写(override)的区别
    servlet中请求转发(forword)和重定向(redirect)的区别
    团队-项目名称五子棋-团队一阶段互评
    团队-项目名称五子棋-开发环境搭建过程
  • 原文地址:https://www.cnblogs.com/kxy3-1314/p/4732702.html
Copyright © 2020-2023  润新知