当前位置: 首页 > 编程日记 > 正文

ASP.NET 应用中大文件上传研究

在项目中经常要用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的组件发现用的比较多的有两个控件AspnetUpload 2.0和Lion.Web.UpLoadModule,两个控件的方法是:利用隐含的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;
}

相关文章:

哪家互联网公司涨薪最厉害?居然不是阿里腾讯

最近脉脉职言区有一条讨论火了&#xff1a;哪家互联网公司涨薪最厉害&#xff1f;按照拼多多员工的说法&#xff0c;应届毕业生可以拿比腾讯阿里高30%的薪资&#xff0c;而有工作经验的员工普遍薪资水平也高出业内30%~50%以上。而且在去年由于疫情众多企业降薪、甚至裁员的状况…

如何修改 远程桌面的 默认端口号 3389

修改注册表的以下位置的键值&#xff1a; [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]"PortNumber"dword:00000d3d

Yolov11-detect训练自己的数据集

至此,整个YOLOv11的训练预测阶段完成,与YOLOv8差不多。欢迎各位批评指正。

联通和阿里云合作 建互联网云化卡号管理系统

1月17日晚间消息&#xff0c;继去年11月中国联通与阿里巴巴签订战略合作框架协议之后&#xff0c;今天下午阿里云宣布将于中国联通建卡号管理系统“cBSS2.0集中号卡系统”。据了解&#xff0c;这将是电信行业第一个核心业务系统云化改造的重点工程&#xff0c;也是云计算技术在…

如何最大限度提高.NET的性能

优化 .NET的性能 1&#xff09;避免使用ArrayList。 因为任何对象添加到ArrayList都要封箱为System.Object类型&#xff0c;从ArrayList取出数据时&#xff0c;要拆箱回实际的类型。建议使用自定义的集合类型代替ArrayList。.net 2.0提供了一个新的类型&#xff0c;叫泛型…

别找了,Thonny 才是 Python 小白的最理想的 IDE

来源 | Python编程时光作者 | 写代码的明哥头图 | 下载于视觉中国当你在搜索引擎&#xff08;如百度&#xff09;或者各种问答社区&#xff08;如知乎&#xff09;搜索『学习Python 最好的 IDE/编辑器是哪个&#xff1f;』的时候&#xff0c;我想答案肯定是&#xff1a;PyCharm…

图书抄袭何时休,技术人的版权在哪里?

今天&#xff0c;一个很偶然的机会&#xff0c;看到了一本北京邮电大学出版社出版的技术图书《Linux服务器架设、性能调优、集群管理教程——实训与项目案例》&#xff0c;感觉有种似曾相识的感觉&#xff0c;于是打开目录大概了解了下&#xff0c;一个我不想看到的现象发生了&…

让MySql支持表情符号(MySQL中4字节utf8字符保存方法)

UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节&#xff0c;而MySQL的utf8编码最多3个字节&#xff0c;所以数据插不进去。解决方案&#xff1a;将编码从utf8转换成utf8mb4。 1. 修改my.ini [mysqld] character-set-serverutf8mb4 2. 在Connector/J的连接参数中&a…

短信编码类无错版PDUdecoding.cs

////程 序 员&#xff1a;武志文(蚕蛹)/// sillnet163.net///文 件&#xff1a;PDUdecoding.cs///概 要&#xff1a;针对国内短信编码&#xff08;USC2&#xff09;///组成结构&#xff1a;包含四个函数&#xff1a;/// smsDecodedCenterNumber(string…

你还有学了三年建模的朋友吗?他有救了

【 编者按】“我朋友学了 3 年建模”系列&#xff0c;一直以浮夸的操作占据于各大视频网站搞笑榜。此前&#xff0c;来自布拉格捷克理工大学、 Google 研究院、和华盛顿大学以及苏黎世联邦理工学院的研究者们发布了 Monster Mash 项目的论文和动效视频。用户绘制二维图像&#…

iOS培训objective-c——实例化对象

蓝鸥iOS培训推荐&#xff1a;好像好长时间没和大家分享了&#xff0c;那么今天主要和大家说说OC内容创建实例化对象&#xff0c;基本让也就分为几大类&#xff1a;1.ClassName*myNewClassName;//指针2.myNewClassName[ClassNamealloc];//通过alloc这个命令申请一个空间来存放我…

#423 Div2 D

#423 Div2 D 题意 构造一个 n 个节点的树&#xff0c;恰好有 k 个叶子节点 (叶子节点的定义是只与树上的某一个节点存在连边)&#xff0c;要求任意两个叶子节点的距离的最大值最小&#xff0c;距离为两个节点间边的数量&#xff0c;输出距离的最大值&#xff0c;以及 n - 1 条边…

CDMA模块上网设置的过程

CDMA模块上网设置的过程一&#xff09; AT指令设置部分&#xff08;1&#xff09; ATCSQ 检查信号 若返回10—31&#xff0c;99之间的信号数字则继续&#xff0c;如果信号是99&#xff0c;99&#xff0c;则应该考虑不停的键入A/命令&#xff0c;不停的让模块去搜寻网络。&…

RedHat 年度报告:只索取不贡献的开源消费“大户”不受待见

编译 | 清儿爸编辑 | 夕颜头图 | 下载于视觉中国据 Red Hat 公司委托发布的一份新报告称&#xff0c;新冠疫情可能在云计算基础设施和企业开源软件方面留下不可磨灭的印记。Red Hat 是 IBM 于 2018 年以 340 亿美元收购的企业开源软件产品供应商。第三次年度《企业开源现状》&a…

做产品的一些思考

从我当前的职业经历来看&#xff0c;做过两种类别的产品&#xff1a;一种是客户定义好了需求由我们去实现&#xff0c;我姑且称其为做项目&#xff1b;一种是自己去探索用户需求然后在不断的摸索中引导用户&#xff0c;实现价值&#xff0c;这是我笔下真正的产品。做项目目标明…

查看JDK的历史版本

1.打开如下链接http://www.oracle.com/technetwork/java/javase/downloads/index.html2.查找如下内容,点击进行3.选择你需要的版本,点击进入4.找到相应的版本下载即可转载于:https://blog.51cto.com/suyanzhu/1947530

终于有人解救Python人了!

从事Python开发的这些年中&#xff0c;我见过很多相关的入门教程和书籍&#xff0c;他们大都这样讲 &#xff1a;先介绍 Python 的基本语法规则、list、dict、tuple 等数据结构&#xff0c;然后再介绍字符串处理和正则表达式&#xff0c;介绍文件等IO操作.... 就这样一点一点往…

WISMO模块GPRS上网设置的过程

WISMO模块GPRS上网设置的过程一&#xff09; AT指令设置部分&#xff08;1&#xff09; ATCGCLASS“B”置为“B”模式。&#xff08;2&#xff09; ATCGDCONT1&#xff0c;“IP”&#xff0c;“CMNET”设置APN。&#xff08;3&#xff09; ATCSQ 检查信号 若返回10—31&#x…

【虚拟化实战】VM设计之一vCPU

作者&#xff1a;范军 &#xff08;Frank Fan&#xff09; 新浪微博&#xff1a;frankfan7虚拟机需要多少个vCPU呢&#xff1f;是不是个数越多性能越好呢&#xff1f;这方面存在着很多误区。给VM配置CPU资源的时候&#xff0c;要精打细算才能最大可能的利用已有资源&#xff0c…

新手小白 python之路 Day1 (三级菜单功能实现)

直接上需求: 实现一个多级菜单 三级菜单的实现 可以依次选择进入各个子菜单 也可以返回上级菜单 所需知识 列表 字典 需求也比较简单&#xff0c;但实际上做起来还是遇到许多的问题&#xff0c;我这边主要用到的知识点大概就是 字典 等 大致的思路 我…

简要AT命令介绍

FUNCTIONSAT COMMANDSDETAILS厂家认证ATCGMI获得厂家的标识模式认证ATCGMM查询支持频段修订认证ATCGMR查询软件版本生产序号ATCGSN查询IMEI NO.TE设置ATCSCS选择支持网络查询IMSIATCIMI查询国际移动电话支持认证卡的认证ATCCID查询SIM卡的序列号功能列表ATGCAP查询可供使用的功…

CentOS 5.6下创建KVM虚拟机

【51CTO专家投稿】RedHat 的下一代旗舰产品RedHat Enterprise Linux 6只包含 KVM&#xff0c;这一点 RedHat 官方已经在很久以前、在不同场合都确认过。KVM 发展很快&#xff0c;稳定性有了很大提高&#xff0c;随着 RHEL 6 的正式到来&#xff0c;KVM 应用到生产环境的日子应该…

手把手教你如何制作可视化大屏!

在我们生活和工作中&#xff0c;经常会看到可视化大屏&#xff0c;主要用于展示一些汇总信息&#xff0c;那如何制作一个酷炫的可视化大屏呢&#xff1f;今天带大家看个github上的案例。项目地址&#xff1a;https://github.com/yyhsong/iDataV/tree/master/case09效果如下&…

ES5和ES6数组遍历方法详解

ES5和ES6数组遍历方法详解 在ES5中常用的10种数组遍历方法: 1、原始的for循环语句2、Array.prototype.forEach数组对象内置方法3、Array.prototype.map数组对象内置方法4、Array.prototype.filter数组对象内置方法5、Array.prototype.reduce数组对象内置方法6、Array.prototype…

短信猫GSM Modem

短信猫是用来收发短信的设备&#xff0c;和手机一样 插入SIM卡&#xff0c;通过&#xff08;USB或串口&#xff09;数据线/PCI插槽接到电脑上 在电脑上通过相关软件就可以实现短信收发的功能相关软件也就是收发短信的短信应用软件 可以自己开发&#xff0c;也可以要求短信猫设备…

数量级提升!深度学习让机器人抓取更高效

作者 | Jeffrey Ichnowski等译者 | 凌霄出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;摘要电子商务仓库中的拣选机器人需要快速计算各种配置之间有效且平稳的机器人手臂运动。最近的研究中是将抓取力分析与手臂运动规划结合&#xff0c;以计算最佳的手臂平滑运动&a…

phpcms_v9修改文章会提示 [hash]数据验证失败

收藏备用&#xff1a;phpcms\modules\content\templates\content_edit.tpl.phpaction"?mcontent&ccontent&aedit改成action"?mcontent&ccontent&aedit&pc_hash<?php echo $_SESSION[pc_hash];?>"转载于:https://blog.51cto.com/w…

横向ListView(一) ——开篇,基础逻辑实现

2019独角兽企业重金招聘Python工程师标准>>> 第一次写博文&#xff0c;写得不好的地方还望各位看客见谅 为了学习自定义软件开发&#xff0c;且定制出满足自己需求的控件&#xff08;不需要将就地使用第三方源码&#xff09;&#xff0c;本人花了一周的时间开发了个…

HTTP Response中的Chunked编码

进行Chunked编码传输的HTTP Response会在消息头部设置&#xff1a; Transfer-Encoding: chunked 表示Content Body将用Chunked编码传输内容。 Chunked编码使用若干个Chunk串连而成&#xff0c;由一个标明长度为0的chunk标示结束。每个Chunk分为头部和正文两部分&#xff0c;头部…

ORACLE RAC 更改instance name完整步骤

下面是更改的部分步骤&#xff0c;但是启动问题还是存在&#xff0c;求达人完整。单实例的数据库修改SID比较简单&#xff0c;只需要修改pfile相关参数&#xff0c;就可以挂载数据库。 RAC环境其实一样&#xff0c;只不过除了修改pfile&#xff0c;还需要修改 OCR信息。首先来看…