两周前就想把这点经验记录下来了,由于拖延症上身,直到刚才突然想起这件未完成的任务,今天是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. NSMutable属性声明时为什么不能使用copy

    在iOS开发里面我们经常会进行NSMutable(可变类型的类,常用的如NSMutableString,NSMutableArray,NSMutableDictionary,NSMutableData ...

  2. Java线程:线程栈模型

    要理解线程调度的原理,以及线程执行过程,必须理解线程栈模型. 线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶.线程栈的内容是随着程序的运行动态变化的,因此研究线程栈必须选择一个运 ...

  3. 深入剖析java迭代器以及C#迭代器!

    目录: 知道迭代器接口Iterable 为什么java的for增强可以自动迭代 那些类可以被迭代 通过什么方法迭代 1.知道迭代器接口Iterable 解析: 迭代器(iterator)是一种对象,它 ...

  4. 【★】KMP算法完整教程

    KMP算法完整教程 全称:                               Knuth_Morris_Pratt Algorithm(KMP算法) 类型:                 ...

  5. 201521123004 《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList的contains源代码 答:从ArrayList ...

  6. 201521123099 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  7. 201521123007《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 作业参考文件下载 1. 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.jav ...

  8. 201521123038 《Java程序设计》 第十二周学习总结

    201521123038 <Java程序设计> 第十二周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student ...

  9. Spring Boot Maven Plugin(二):run目标

    简介 Spring Boot Maven Plugin插件提供spring boot在maven中的支持.允许你打包可运行的jar包或war包. 插件提供了几个maven目标和Spring Boot ...

  10. SimpleRpc-系统边界以及整体架构

    系统边界 什么是系统边界?系统边界就是在系统设计之初,对系统所要实现的功能进行界定,不乱添加,不多添加.这么做的好处就是,系统简单明了,主旨明确,方便开发和用户使用.举个例子,一个自动售货机的本职工作 ...