登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

深入技术..

技術改變生活

 
 
 

日志

 
 

大文件上传  

2009-03-24 11:07:30|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

ASP.NET上传控件V1.0 beta2提供

2007-12-24 13:37

功能介绍

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;

    }

  评论这张
 
阅读(2033)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018