两周前就想把这点经验记录下来了,由于拖延症上身,直到刚才突然想起这件未完成的任务,今天是1024,在这个特别的日子里,祝所有程序猿兄弟姐妹们节日快乐!

上传功能一直很正常,直到上传了个500多兆的文件,报错提示:

“System.OutOfMemoryException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理

对于内部用途和新的托管对象,确保要有足够的内存可供分配。
如果要创建数组,请确保大小正确。

由于调用的webservice中的文件上传方法参数为二进制格式,需要把文件流转换为byte格式,所以直接写了byte[] byte = new byte[stream.Length],结果那个大文件就是在这句卡住了,一开始也很蒙圈,已经在配置文件中修改了最大请求的长度为何还会有问题,调试代码发现new byte[]的时候括号内要求参数是一个8位的整数,那个500多兆的文件转为字节后是个9位数,导致byte类型超出索引,于是想到每次实例化一个固定长度的byte,让文件循环写入,写满一个byte就放入数组,然后在服务端在解析这个数组即可,这样就不会存在内存溢出的问题了,下面是示例代码,仅供参考,若要带走,欢迎转发。

脚本部分在上一篇中有代码展示,这里只展示后台和服务端代码了。

1.一般处理程序部分:

public void FileUpload(HttpContext context)
{
WebService ws = new WebService();
ws.Timeout = ; //单位毫秒,1小时 HttpFileCollection files = context.Request.Files;
if (files.Count > )
{
/*获取真实文件名,files[0].FileName这种方法在IE浏览器中上传会带有F://路径*/
string filename = System.IO.Path.GetFileName(files[].FileName);
HttpPostedFile file = files[];
Stream fs = file.InputStream; /*定义object数组,用来存放byte数据*/
object[] obj = new object[] { };
List<object> list = new List<object>();
int offcount = ; /* size:1M,unit:byte */
int LimitSize = ;/*限制大小150M,unit:byte*/
if (fs.Length > LimitSize)
{
context.Response.Write("OutOfSize");
context.Response.End();
return;
}
int filelen = (int)fs.Length;
if (filelen > offcount)
{
long offset = ;
byte[] postArray = new byte[offcount];
int temponum = filelen / offcount;
/*整数部分*/
for (int i = ; i <= temponum; i++)
{
long lkl = filelen;
postArray = new byte[offcount];
fs.Seek(offset, SeekOrigin.Begin);
fs.Read(postArray, , offcount);
list.Add(postArray);
offset += offcount;
}
/*剩余部分*/
if (temponum * offcount < filelen)
{
offcount = filelen - temponum * offcount;
byte[] lpostArray = new byte[offcount];
fs.Seek(offset, SeekOrigin.Begin);
fs.Read(lpostArray, , offcount);
list.Add(lpostArray);
}
}
else
{
byte[] postArray = new byte[file.ContentLength];
fs.Read(postArray, , file.ContentLength);
list.Add(postArray);
}
/*list集合转为object数组*/
obj = list.ToArray();
fs.Flush();
fs.Close();
/*计算文件大小,文件大于1M,单位用M,其他用KB*/
string filesize = string.Empty;
if (filelen > )
{ filesize = Math.Ceiling((double)filelen / (double) / (double)) + "M"; }
else
{ filesize = Math.Ceiling((double)filelen / (double)) + "KB"; } /*为防止流长度溢出byte,固定byte大小放入object数组*/
string result = ws.objUploadFile(obj, "FileFolder", filename);
}
}

2.webservice服务端部分:

  /// <summary>
/// 上传文件
/// </summary>
/// <param name="obj">分割的byte[]数组</param>
/// <param name="path">文件存放文件夹</param>
/// <param name="fileName">文件名字</param>
/// <returns>文件的路径</returns>
[WebMethod(Description = "上传文件,返回路径")]
public string objUploadFile(object[] obj, string path, string fileName)
{
string ReturnPath = string.Empty;
FileStream wf = null;
byte[] fs;
try
{
string _FileName = string.Empty;
string FilePath = "uploadfiles\\document\\" + path;
FilePath = Server.MapPath(FilePath);
if (!Directory.Exists(FilePath))
{
Directory.CreateDirectory(FilePath);
} System.Random rnd = new System.Random();
string tmp = rnd.Next().ToString();
_FileName = "File_" + tmp + "_" + fileName; //文件名加随机数字
wf = new FileStream(FilePath + "\\" + _FileName, FileMode.Append, FileAccess.Write);
if (obj.Length > )
{
for (int i = ; i < obj.Length; i++)
{
fs = (byte[])obj[i];
wf.Write(fs, , fs.Length);
}
}
wf.Close();
wf = null;
ReturnPath = "\\uploadfiles\\document\\" + path + "\\" + _FileName;
}
catch
{
ReturnPath = string.Empty;
}
finally
{
}
return ReturnPath;
}

希望本文能够帮助遇到同样问题的同学们,如有不妥之处,欢迎指正。

文件上传之--内存溢出(System.OutOfMemoryException)的更多相关文章

  1. .Net内存溢出 System.OutOfMemoryException

    内存溢出常见的情况和处理方式: http://outofmemory.cn/c/dotNet-outOfMemoryException MSDN中关于processModel的文档 https://m ...

  2. 内存溢出System.OutOfMemoryException

    .Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结 在什么情况下会出现OutOfMemonryException呢? 在我们试图新建一个对象时,而垃圾 ...

  3. ASP.NET MVC HttpPostedFileBase文件上传

    HttpPostedFileBase文件上传,支持多文件一次上传,如有图片,则支持略缩图保存 文件传输信息封装 /// <summary> /// 文件生成方式 /// </summ ...

  4. 文件上传下载(C#,web,asp.net)

    目的:在浏览器页面启动上传下载CS软件,实现文件的批量下载与上传. 技术路线: 开发上传下载客户端CS程序与注册程序,压缩放到服务器端指定位置: 开发服务器端程序用以接收上传请求,压缩放到服务器端: ...

  5. jsp 文件上传操作

    文件上传 1:完成一个文件上传的功能 index.jsp 注意更换form表单的enctype enctype就是encodetype就是编码类型的意思. multipart/form-data是指表 ...

  6. 用SpringMVC实现的上传下载方式二(多文件上传)

    参考来源:      http://blog.csdn.net/qq_32953079/article/details/52290208 1.导入相关jar包 commons-fileupload.j ...

  7. 文件上传报错:Unknown: file created in the system's temporary directory

    nginx+php下文件上传成功,但会有错误提示如下: <b>Notice</b>:  Unknown: file created in the system's tempor ...

  8. webform文件上传、图片水印、验证码

    文件上传: 所用控件:FileUpload 使用时的思路: 1.判断用户是否选中了文件 FileUpload.FileName获取选中的文件名,判断长度,如果长度大于零就代表已经选择了文件 JS端:通 ...

  9. Webform(文件上传)

    1.HTML编码: <input type="file" /> 2.控件:FileUpload 它是用来选择要上传的文件,还需要一个按钮来将选中的文件上传到服务器上 s ...

随机推荐

  1. 关于SCSI/SATA/IDE硬盘的比较

    看linux的书时,发现许多地方提到SCSI/SATA/IDE这几种硬盘接口,对这些硬盘的概念和区别感到很模糊.所以特意查了一些资料,基本上算是弄懂了他们的区别. 目前硬盘最要分为3种.也即:IDE. ...

  2. 团队作业8——第二次项目冲刺(Beta阶段)Day4--5.21

    展开圆桌式会议: 会议内容:1.团队成员对昨天任务完成情况做一个简单交流,并对昨天工作中存在的问题提出集中讨论解决:2.按照昨天的昨天工作分配表做具体的任务分配:3.简单讨论明天的任务分配每个人的工作 ...

  3. OSGi-开发环境的建立和HelloWorld(04)

    1 OSGi开发环境的建立 1.1 Equinox是什么 从代码角度来看,Equinox其实就是OSGi核心标准的完整实现,并且还在这个基础上增加了一些额外的功能(比如为框架增加了命令行和程序执行的入 ...

  4. 建一座安全的“天空城” ——揭秘腾讯WeTest如何与祖龙共同挖掘手游安全漏洞

    作者:腾讯WeTest手游安全测试团队商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest导读 <九州天空城3D>上线至今,长期稳定在APP Store畅销排行的前 ...

  5. 【Debian 8.8】Java 8 安装以及环境变量配置

    事实上可以分为简单的三个步骤: 下载 JDK 压缩包 解压压缩包 配置环境变量 需要注意的是: 所有命令默认在 root 权限下进行! 演示环境是 Debian 8.8 64位 (阿里云学生机) 1. ...

  6. Linux 下安装maven

    1.首先到Maven官网下载安装文件,目前最新版本为3.0.3,下载文件为apache-maven-3.0.3-bin.tar.gz,下载可以使用wget命令:2.进入下载文件夹,找到下载的文件,运行 ...

  7. ng-options的使用

    参考:官方文档.zhx1991 select 无默认选择一项 <select name="" id="" class="form-control ...

  8. div内部实现图片旋转、放大、缩小、拖拽

    药药,切克闹,一人我编码累,累把那bug写成堆.秋高气爽空气干燥你一定dei多喝水,过完了这周我就要回去.趁还有几天.你尽情的来跟我怼~~~ 新的一年,很久没更博客了,眼看十一要来了,听说过了十一就等 ...

  9. 压缩感知中的lp球:p范数最优化为什么总会导致一个稀疏的解的原因

    转自:彬彬有礼. 压缩感知中的lp球:p范数最优化为什么总会导致一个稀疏的解的原因 http://blog.csdn.net/jbb0523/article/details/40268943 题目: ...

  10. spring依赖注入中接口的问题

    问题描述:一个接口,有俩个实现类当注入时候名字不同时,会出现不同的情况 action层: @Controller("userAction") @Scope("protot ...