zoukankan      html  css  js  c++  java
  • 大文件上传研究《转》

    ASP.NET上传控件V1.0 beta2提供
    演示:http://www.new57.com/Upload.aspx
    下载:http://www.new57.com/download/ewebapp.net.zip

    功能介绍



    1.支持大文件上传,无刷新即时进度显示
    2.可设置上传文件自动压缩或自动解压缩
    3.图片上传可自定义压缩、缩略、水印
    4.上传文件格式、大小自定义设置
    5.文件自动保存及自动数据处理并提供相关接口
    6.支持验证控件
    7.用户可自定义控件样式
    8.压缩操作可附加文件,与压缩附加信息,及设置压缩密码

    如何使用



    1.Web.Config的设置
    本控件使用到httpModule
    所以要在Web.Config的增加控件的httpModule


    如果上传大文件还要注意修改Web.config的上传大小限制与超时时间限制

    2.控件的引用
    方法1:使用VS直接在工具栏中增加该控件,然后进行拖放设计
    方法2:将eWebapp.Upload.dll拷贝到Bin目录
    3.控件的使用
    本控件实际上包含两个控件ShowUpload与Upload
    (1)ShowUpload控件 为显示上传进度的控件
    如果您只想显示上传进度,您可以在页面中引用ShowUpload控件
    请不要修改该控件的GUID值,因为该值是上传进度的唯一标识,如果固定,那么多用户同时上传时将会出现错误
    然后布置1到N个的HtmlUpFile控件,这里要注意的HtmlUpFile控件必须加Runat="Server"
    您可以为该控件SubmitID指定上传Button的ID,以明确哪个Button将提交文件
    也可以默认使用第一个Button上传文件并显示进度
    关于些控件的显示样式您也可以自行设置,也可以使用默认
    (2)Upload控件 为上传控件
    在beta2中使用选择性自动保存功能,如果AutoSave设置为False,用户只要调用该控件的Save方法对上传文件进行处理并保存
    在Upload中内置了ShowUpload控件,您可以在控件的"进度条"设置中设置内置进度条的设置
    这里说明一下文件处理的有关注意点:
    第一个选择点是上传类型"Uptype"设置
    选择Image可以进行以下处理
    图片压缩,图片缩略,图片水印
    选择File下可以进行以下处理
    文件压缩(zip),文件解压(unzip),与普通上传(Normal)
    注意压缩功能目前仅支持Zip算法
    更多设置与处理说明请访问我的Blog

    小技巧



    1.使用Upload控件实现多文件上传并显示进度
    只需要第一个Upload控件的ShowUpload设置为true,其它Upload控件ShowUpload设置为false即可
    每个文件的保存路径将由控件的FullPath获取
    2.只保存缩略图
    设置Uptype为Image将OnlySmall设为True
    保存路径由FullPath直接返回
    3.做个压缩上传自动解压功能让多文件一次上传
    设置Uptype为File,SaveType为Unzip
    再指定upZipDir为解压路径
    4.打个水印
    设置Uptype为Image将WaterPrint设置为服务器上的水印图片地址(留空不打水印)
    5.将文件保存到指定位置
    默认情况下系统用以"上传文件夹\年\月\日\GUID\文件名"的形式存放文档
    如果您想把文件保存到eUpload\文件名可以如下设置
    ToPath设置为eUpload
    GUID留空
    UserTimeSave设置为False
    FileName建议别设置,默认即为值为文件的文件名
    如果设置StrongSave为True,上传会强行覆盖相同文件名的文件
    如果设置StrongSave为False,保存自动加文件的(?)标识
    即如果已存在eWebapp.Txt文件,上传同名文件会保存到eWebapp(1).Txt,依次类推.
    上传完成后FileName返回是实际保存的文件
    FullPath为相对于根目录的全路径.

    ---------------------------

     
       这次在项目中,用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的
    组件发现用的比较多的有两个控件AspnetUpload 2.0和Lion.Web.UpLoadModule,另外还有思归在它的博客
    堂中所说的办法 
    http://blog.joycode.com/saucer/archive/2004/03/16/16225.aspx
       两个控件的方法是:利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。Chris Hynes为我们提供了这样的一个方案(用HttpModule),该方案除了允许你上传大文件外,还能实时显示上传进度。
        Lion.Web.UpLoadModule和AspnetUpload 两个.NET组件都是利用的这个方案。
       当上传单文件时,两个软件的方法是一样的,继承HttpModule
           HttpApplication application1 = sender as HttpApplication;
       HttpWorkerRequest request1 = (HttpWorkerRequest) ((IServiceProvider) HttpContext.Current).GetService(typeof(HttpWorkerRequest));
       try
       {
        if (application1.Context.Request.ContentType.IndexOf("multipart/form-data") <= -1)
        {
         return;
        }
        //Check The HasEntityBody
        if (!request1.HasEntityBody())
        {
         return;
        }

        int num1 = 0;
        TimeSpan span1 = DateTime.Now.Subtract(this.beginTime);

        string text1 = application1.Context.Request.ContentType.ToLower();

        byte[] buffer1 = Encoding.ASCII.GetBytes(("\r\n--" + text1.Substring(text1.IndexOf("boundary=") + 9)).ToCharArray());
        int num2 = Convert.ToInt32(request1.GetKnownRequestHeader(11));
        Progress progress1 = new Progress();

        application1.Context.Items.Add("FileList", new Hashtable());

        byte[] buffer2 = request1.GetPreloadedEntityBody();
        num1 += buffer2.Length;

        string text2 = this.AnalysePreloadedEntityBody(buffer2, "UploadGUID");
        if (text2 != string.Empty)
        {
         application1.Context.Items.Add("LionSky_UpLoadModule_UploadGUID", text2);
        }
        bool flag1 = true;
        if ((num2 > this.UpLoadFileLength()) && ((0 > span1.TotalHours) || (span1.TotalHours > 3)))
        {
         flag1 = false;
        }
        if ((0 > span1.TotalHours) || (span1.TotalHours > 3))
        {
         flag1 = false;
        }
        string text3 = this.AnalysePreloadedEntityBody(buffer2, "UploadFolder");
        ArrayList list1 = new ArrayList();
        RequestStream stream1 = new RequestStream(buffer2, buffer1, null, RequestStream.FileStatus.Close, RequestStream.ReadStatus.NoRead, text3, flag1, application1.Context, string.Empty);
        list1.AddRange(stream1.ReadBody);
        if (text2 != string.Empty)
        {
         progress1.FileLength = num2;
         progress1.ReceivedLength = num1;
         progress1.FileName = stream1.OriginalFileName;
         progress1.FileCount = ((Hashtable) application1.Context.Items["FileList"]).Count;
         application1.Application["_UploadGUID_" + text2] = progress1;
        }
        if (!request1.IsEntireEntityBodyIsPreloaded())
        {
         byte[] buffer4;
         ArrayList list2;
         int num3 = 204800;
         byte[] buffer3 = new byte[num3];
         while ((num2 - num1) >= num3)
         {
          if (!application1.Context.Response.IsClientConnected)
          {
           this.ClearApplication(application1);
          }
          num3 = request1.ReadEntityBody(buffer3, buffer3.Length);
          num1 += num3;
          list2 = stream1.ContentBody;
          if (list2.Count > 0)
          {
           buffer4 = new byte[list2.Count + buffer3.Length];
           list2.CopyTo(buffer4, 0);
           buffer3.CopyTo(buffer4, list2.Count);
           stream1 = new RequestStream(buffer4, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
          }
          else
          {
           stream1 = new RequestStream(buffer3, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
          }
          list1.AddRange(stream1.ReadBody);
          if (text2 != string.Empty)
          {
           progress1.ReceivedLength = num1;
           progress1.FileName = stream1.OriginalFileName;
           progress1.FileCount = ((Hashtable) application1.Context.Items["FileList"]).Count;
           application1.Application["_UploadGUID_" + text2] = progress1;
          }
         }
         buffer3 = new byte[num2 - num1];
         if (!application1.Context.Response.IsClientConnected && (stream1.FStatus == RequestStream.FileStatus.Open))
         {
          this.ClearApplication(application1);
         }
         num3 = request1.ReadEntityBody(buffer3, buffer3.Length);
         list2 = stream1.ContentBody;
         if (list2.Count > 0)
         {
          buffer4 = new byte[list2.Count + buffer3.Length];
          list2.CopyTo(buffer4, 0);
          buffer3.CopyTo(buffer4, list2.Count);
          stream1 = new RequestStream(buffer4, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
         }
         else
         {
          stream1 = new RequestStream(buffer3, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
         }
         list1.AddRange(stream1.ReadBody);
         if (text2 != string.Empty)
         {
          progress1.ReceivedLength = num1 + buffer3.Length;
          progress1.FileName = stream1.OriginalFileName;
          progress1.FileCount = ((Hashtable) application1.Context.Items["FileList"]).Count;
          if (flag1)
          {
           progress1.UploadStatus = Progress.UploadStatusEnum.Uploaded;
          }
          else
          {
           application1.Application.Remove("_UploadGUID_" + text2);
          }
         }
        }
        byte[] buffer5 = new byte[list1.Count];
        list1.CopyTo(buffer5);
        this.PopulateRequestData(request1, buffer5);
       }
       catch (Exception exception1)
       {
        this.ClearApplication(application1);
        throw exception1;
       }


      而思归所说的方法使用Mime也能上传大文件,在以下地址下载
      
    http://krystalware.com/files/slickupload.zip
      不过觉得的思归的方法容易很多


  • 相关阅读:
    C/C++多文件之间的变量定义
    PKU POJ 2186 Popular Cows 强连通分量
    重载函数
    ZOJ 2763 Prison Break
    201357 训练赛总结
    hdu 4467 Graph 构造
    201356 训练赛总结
    201353 NEERC 2012, Eastern subregional contest
    2013512 CF 183 总结
    一道动态规划
  • 原文地址:https://www.cnblogs.com/huashanlin/p/484839.html
Copyright © 2011-2022 走看看