仰天一笑

昨日不悔,今日勿失,明日莫忧! —徐羽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  230 随笔 :: 27 文章 :: 816 评论 :: 41 引用

这次在项目中,用到了大文件上传,要上传的文件有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
  不过觉得的思归的方法容易很多

相关文章:
让asp.net默认的上传组件支持进度条反映
http://blog.joycode.com/dotey/archive/2005/06/12/53557.aspx // 宝玉
http://blog.joycode.com/saucer/archive/2004/03/16/16225.aspx // 思归
http://www.cnblogs.com/bestcomy/archive/2004/06/09/14267.aspx // bestcomy
http://krystalware.com/wiki/default.aspx/KrystalWiki.UploadSpike1
http://www.blueidea.com/tech/program/2005/2997.asp //ftp
通过Web Services上传和下载文件
http://dotnet.aspx.cc/ShowDetail.aspx?id=6381BD5F-51F3-4339-4239-1328564A1B2A
上传组件是如何不受settimeout限制的?
http://www.ietf.org/rfc/rfc1867.txt?number=1867

下载
http://support.microsoft.com/default.aspx?scid=kb;en-us;812406&Product=aspnet

上传源代码下载:
openlabupload.rar

posted on 2006-07-11 16:54 仰天一笑 阅读(4343) 评论(81)  编辑 收藏 网摘 所属分类: 原创天地ASP.Net-C#

评论

#1楼  2006-07-11 18:03 高海东      
整理的好
  回复  引用  查看    

good!!!
这篇文章写得不错阿!!

<a href="http://www.headset.org.cn">电话耳机</a>">http://www.headset.org.cn">电话耳机</a> , http://www.headset.org.cn 电话耳机行业网站,推荐一下,谢谢!
  回复  引用    

#3楼  2006-07-24 12:16 chixiaojin      
楼主能发个你的源码参考一下.最近的项目用到这个找了很久
还没有解决这个问题.... chixiaojin666666@163.com 先谢了.
  回复  引用  查看    

#4楼 [楼主] 2006-07-25 12:42 仰天一笑      
@chixiaojin
源代码,已经发送到你的邮箱,请查收,顺带一句,谁需要源码,请留下Email或直接Mail我ansonxy@gmail.com。
  回复  引用  查看    

#5楼  2006-07-25 16:03 showstrong [未注册用户]
请给个源码。谢谢
showstrong@126.com
  回复  引用    

#6楼  2006-07-26 17:37 wjwsnow [未注册用户]
请给个源码
我的邮箱是wjwsnow@sohu.com
谢谢!
  回复  引用    

#7楼  2006-08-01 14:31 Melas [未注册用户]
我也要个
我的邮箱是hsq0079@163.com
  回复  引用    

#8楼  2006-08-09 17:09 gaokan [未注册用户]
我也要个源代码
我的邮箱是gaokan0816@hotmail.com
多谢
  回复  引用    

#9楼  2006-08-09 21:19 高海东      
ghd258@163.com
  回复  引用  查看    

#10楼 [楼主] 2006-08-12 14:51 仰天一笑      
源码已发送,请查收,若有问题,请Mail
  回复  引用  查看    

#11楼  2006-08-14 15:53 janzhnxer [未注册用户]
janzhnxer@163.com
  回复  引用    

#12楼  2006-08-18 09:53 gpdn [未注册用户]
我也要个源代码
我的邮箱是gpdn945@163.com
多谢
  回复  引用    

太感谢了,小弟也在研究这个东西,能不能发份源码,学习一下,不胜感激
allenyz2001@163.com
  回复  引用    

#14楼 [楼主] 2006-08-30 15:40 仰天一笑      
以上已经发送,请查收
  回复  引用  查看    

#15楼  2006-08-31 17:43 世纪net [未注册用户]
gy8526116@yahoo.com.cn
  回复  引用    

还有我,谢谢楼主
qongchun@163.com
  回复  引用    

#17楼  2006-09-13 14:53 zwq [未注册用户]
还有我
zwq-800808@163.com
  回复  引用    

#18楼  2006-09-13 16:20 szp11 [未注册用户]
楼主我要一份,谢谢!
szp_gl@163.com
szp@schs.gov.cn
  回复  引用    

#19楼  2006-09-16 11:37 san[匿名]      
楼主我也要!
急用。。。
kill-san@hiDotNet.com
  回复  引用  查看    

#20楼 [楼主] 2006-09-25 17:30 仰天一笑      
我已经将上传的源代码放在上面了,自己下载吧,这个很完善
  回复  引用  查看    

#21楼  2006-09-26 11:43 szp11 [未注册用户]
非常感谢楼主!!

谢谢了!
  回复  引用    

#22楼  2006-09-30 15:10 zyysal [未注册用户]
楼主,好象不能下载啊?
能否发一份给我啊!
zyysal851125@163.com
  回复  引用    

楼主可以发我一份吗?
yingjunhao@126.com

  回复  引用    

#24楼  2007-01-12 11:09 许曌铨 [未注册用户]
需要源代码XX3000@YEAH.NET
  回复  引用    

#25楼  2007-01-18 19:46 riyun [未注册用户]
发一份给我,万分感谢!
ldm1975@163.com
  回复  引用    

#26楼  2007-01-22 00:17 Darwin [未注册用户]
源码可以发给我一份吗?darwin@public.guangzhou.gd.cn谢谢了。
  回复  引用    

#27楼  2007-01-22 10:29 minling [未注册用户]
你好,源代码可以发我一份吗?
min965@163.com
  回复  引用    

#28楼 [楼主] 2007-01-22 12:06 仰天一笑      
以上邮件已发出,请查收,文章上面也可以直接下载的。
  回复  引用  查看    

#29楼  2007-01-29 15:16 abaha [未注册用户]
需要源代码!谢谢!guangmissyou@163.com
  回复  引用    

#30楼  2007-02-02 17:25 陈 [未注册用户]
楼主 给一个吧 谢谢
jianlingjob@sohu.com
  回复  引用    

#31楼  2007-02-06 15:58 谢 [未注册用户]
楼主 给一个吧 谢谢
cyx831010@gmail.com
  回复  引用    

#32楼  2007-02-07 14:14 aaa [未注册用户]
下载后怎么运行不了啊
不好意思不知道怎么用
  回复  引用    

#33楼  2007-02-07 14:27 aaa [未注册用户]
ok搞定了
刚才虚拟目录没整对
  回复  引用    

#34楼  2007-02-08 18:30 Ares [未注册用户]
怎么上传了没反应?文件上传放在哪里了?
  回复  引用    

#35楼  2007-02-09 11:03 Ares [未注册用户]
请问一下作者 web\bin\upload.dll 这个组件的源文件有没有啊?
  回复  引用    

#36楼  2007-02-09 23:56 Kay [未注册用户]
你好,源代码可以发我一份吗?
MAIL :in2crazy@hotmail.com
  回复  引用    

#37楼 [楼主] 2007-02-10 09:58 仰天一笑      
@Ares
bin文件的源代码在下载文件中,Upload文件夹中就是upload.dll 的源码。文件传到什么地方,你直接看web文件夹中的路径代码就OK了(源码中是上传到绝对路径D盘的,具体自己修改)。
以上Email大文件源码已经发送,请查收。

  回复  引用  查看    

#38楼  2007-02-27 14:45 dragon [未注册用户]
你好,源代码可以发我一份吗?
MAIL :dragonzhang001@163.com 谢谢

  回复  引用    

#39楼  2007-02-28 13:54 reihui [未注册用户]
你好楼主!源代码可以发我一份吗?非常感谢!
email:renhui@gst.com.cn
  回复  引用    

#40楼  2007-03-03 10:47 zuoli [未注册用户]
楼主也能给我一份源代码吗
zuoli1986@gmail.com
  回复  引用    

#41楼 [楼主] 2007-03-05 12:59 仰天一笑      
以上Mail已经发送,如果有没有收到的,给我Mail
  回复  引用  查看    

#42楼  2007-03-07 14:10 flyinsky [未注册用户]
flyinsk_forever@126.com
  回复  引用    

#43楼  2007-03-09 17:36 lzt [未注册用户]
wldlzt@163.com
  回复  引用    

#44楼  2007-03-09 17:36 lzt [未注册用户]
谢谢先
  回复  引用    

#45楼 [楼主] 2007-03-11 11:28 仰天一笑      
以上Mail已发送
  回复  引用  查看    

#46楼  2007-03-12 14:36 jl [未注册用户]
楼主也能给我一份源代码吗
(用HttpModule)上传大文件的例子和源码

jaland@126.com

谢谢!
  回复  引用    

#47楼  2007-04-04 15:37 bb [未注册用户]
有.net2.0的源码么?
pdacf@163.com
谢谢!
  回复  引用    

#48楼  2007-04-05 15:23 丸子 [未注册用户]
给份源码好吗
yliufeng@126.com
  回复  引用    

#49楼  2007-04-09 21:02 Nick [未注册用户]
给我一份吧 lhgj0518@163.com 谢谢!
  回复  引用    

#50楼 [楼主] 2007-04-10 15:50 仰天一笑      
以上邮件已发送!
  回复  引用  查看    

#51楼  2007-04-16 15:27 Amwpfiqvy      
看起来还不算太晚,我也一份吧
Amwpfiqvy@163.com
  回复  引用  查看    

#52楼  2007-04-16 20:56 bb [未注册用户]
谢谢,邮件已经收到,问下有.net2.0的吗?
pdacf@163.com
  回复  引用    

#53楼  2007-04-30 14:44 andy [未注册用户]
有.net2.0的源码么?
给我也发一份把
andy.chen21@163.com
谢谢
  回复  引用    

#54楼  2007-05-16 09:09 yzc [未注册用户]
看起来真的可以哦,也发一份到我的邮箱,谢了!
jsgxb@126.com
  回复  引用    

#55楼  2007-05-21 15:53 张慧 [未注册用户]
急需,也发一份给俺,谢谢了!
zh@live.it
  回复  引用    

#56楼 [楼主] 2007-05-21 18:02 仰天一笑      
以上邮件已发送
  回复  引用  查看    

#57楼  2007-05-22 13:08 zhang [未注册用户]
这个好像不能支持断点续传啊!
有谁有能支持断点续传的源代码给我发一份,非常感谢啊!
zh@live.it
  回复  引用    

#58楼  2007-05-23 12:17 sam [未注册用户]
正在头大,麻烦也给我一份 samontom@tom.com 万分感谢
  回复  引用    

#59楼  2007-07-10 11:46 chm [未注册用户]
老兄 麻烦你发给我一份,非常感谢啊!
cheng_hm2003@163.com
  回复  引用    

#60楼  2007-07-15 10:40 yhrch [未注册用户]
老兄 正好要用这个,麻烦给我也发一份,谢谢!
yhrch@126.com
  回复  引用    

发一份给我吧,我正好用到sunypoplar@163.com
  回复  引用    

#62楼  2007-07-24 11:36 zl [未注册用户]
发一份给我吧,我正好用到zlgdf@163.com
  回复  引用    

#63楼 [楼主] 2007-07-25 10:03 仰天一笑      
以上邮件已发送,请查收
  回复  引用  查看    

#64楼  2007-07-27 22:16 JACK [未注册用户]
大哥写得不错,能不能也发一份给我啊,
偶做得项目正好用到,偶的EMAIL是:xlf_896433@163.com
先谢谢了~~
  回复  引用    

#65楼  2007-08-21 13:48 1 [未注册用户]
兄弟,也给我发一份吧,找了好久了,呵呵,先谢谢了,sunjianxun0110@163.com
  回复  引用    

#66楼  2007-08-22 00:13 Kef [未注册用户]
兄弟,给我也发一份吧,先谢谢了.Email: kevinwangtiger@gmail.com
  回复  引用    

#67楼  2007-09-10 19:55 bob.zhang [未注册用户]
代码下不了,请给我传一份,谢谢了
E_mail:bob.zhang@achievo.com
  回复  引用    

#68楼 [楼主] 2007-10-09 20:13 仰天一笑      
以上邮件已发送,请查收
  回复  引用  查看    

#69楼  2007-11-19 16:35 sssfff [未注册用户]
OpenlabUpload.rar下载解压后vs2003打不开啊,无法从web服务器获取项目文件
  回复  引用    

#70楼  2007-11-21 14:57 ithurricane      
请给我传一份,谢谢了
E_mail:ithurricane36@126.com

  回复  引用  查看    

#71楼  2007-11-22 10:04 oldzeus [未注册用户]
也给我发一份吧,找了好久了,呵呵,先谢谢了,zksoldzeus@gmail.com
  回复  引用    

#72楼  2007-11-28 16:34 moonza [未注册用户]
我也找了好久了,请给我也传一份吧,谢谢了
E_mail:moonskyv@163.com

  回复  引用    

#73楼  2008-01-09 11:19 疯子疯 [未注册用户]
麻烦博主给发一份
joexf2001@gmail.com
  回复  引用    

麻烦给我发一份
xiawenchen@163.com
  回复  引用    

#75楼  2008-04-21 15:14 花立广 [未注册用户]
谢谢,也给我一份吧,hlgchina@163.com
  回复  引用    

有个平台很好,也给我发分把 我学学看!
  回复  引用    

我也来份吧 研究研究我也来份吧 研究研究

wsq71299363@126.com
  回复  引用    

我下了分学了下 但是不知道文件传到哪里去了 怎么回事
  回复  引用    

#79楼  2008-05-30 12:11 孔 [未注册用户]
给份源码,学习一下,谢谢!
  回复  引用    

#80楼  2008-06-12 11:15 xiaozhu [未注册用户]
我也要个源代码
我的邮箱是这里是zls123737@163.com
多谢
  回复  引用    

#81楼  2008-06-13 00:46 harry11 [未注册用户]
十分感谢!请楼主来分源代码。harry95@163.com
  回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-09-25 17:29 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: