文件上传之--内存溢出(System.OutOfMemoryException)
两周前就想把这点经验记录下来了,由于拖延症上身,直到刚才突然想起这件未完成的任务,今天是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)的更多相关文章
- .Net内存溢出 System.OutOfMemoryException
内存溢出常见的情况和处理方式: http://outofmemory.cn/c/dotNet-outOfMemoryException MSDN中关于processModel的文档 https://m ...
- 内存溢出System.OutOfMemoryException
.Net 内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结 在什么情况下会出现OutOfMemonryException呢? 在我们试图新建一个对象时,而垃圾 ...
- ASP.NET MVC HttpPostedFileBase文件上传
HttpPostedFileBase文件上传,支持多文件一次上传,如有图片,则支持略缩图保存 文件传输信息封装 /// <summary> /// 文件生成方式 /// </summ ...
- 文件上传下载(C#,web,asp.net)
目的:在浏览器页面启动上传下载CS软件,实现文件的批量下载与上传. 技术路线: 开发上传下载客户端CS程序与注册程序,压缩放到服务器端指定位置: 开发服务器端程序用以接收上传请求,压缩放到服务器端: ...
- jsp 文件上传操作
文件上传 1:完成一个文件上传的功能 index.jsp 注意更换form表单的enctype enctype就是encodetype就是编码类型的意思. multipart/form-data是指表 ...
- 用SpringMVC实现的上传下载方式二(多文件上传)
参考来源: http://blog.csdn.net/qq_32953079/article/details/52290208 1.导入相关jar包 commons-fileupload.j ...
- 文件上传报错:Unknown: file created in the system's temporary directory
nginx+php下文件上传成功,但会有错误提示如下: <b>Notice</b>: Unknown: file created in the system's tempor ...
- webform文件上传、图片水印、验证码
文件上传: 所用控件:FileUpload 使用时的思路: 1.判断用户是否选中了文件 FileUpload.FileName获取选中的文件名,判断长度,如果长度大于零就代表已经选择了文件 JS端:通 ...
- Webform(文件上传)
1.HTML编码: <input type="file" /> 2.控件:FileUpload 它是用来选择要上传的文件,还需要一个按钮来将选中的文件上传到服务器上 s ...
随机推荐
- [自制操作系统] BMP格式文件读取&图形界面系统框架/应用接口设计
本文将介绍在本人JOS中实现的简单图形界面应用程序接口,应用程序启动器,以及一些利用了图形界面的示例应用程序. 本文主要涉及以下部分: 内核/用户RW/RW调色板framebuffer共享区域 8bi ...
- 转:深入Java集合学习系列:HashMap的实现原理
1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现(Hashtable跟HashMap很像,唯一的区别是Hashtalbe中的方法是线程安全的,也就是同步的).此实现提供所 ...
- 转:js闭包
一切都是对象 "一切都是对象"这句话的重点在于如何去理解"对象"这个概念. --当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascr ...
- 【Alpha】第七次Daily Scrum Meeting
GIT 一.今日站立式会议照片 二.会议内容 1.讨论送礼物的方法和对象,使功能更加完善. 2.对于程序还存在的问题提出自己的看法,尽量让功能更加的饱满. 三.燃尽图 四.遇到的困难 能 ...
- 团队作业10——Beta版本事后诸葛亮
事后诸葛亮分析 1.总结的提纲内容: a. 项目管理之事后诸葛亮会议. 一.设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件要解决的是教师需要 ...
- 201521123026 《java程序设计》第七周学习总结
1. 本章学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 答: public ...
- 201521123004 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 注意: notify()/notifyAll()方法和wait()方法都只能在被声明为synchronized的方 ...
- Java课程设计——学生信息系统(团队)
团队名称.团队成员介绍 1.1 团队名称 1.2 团队成员 高可心 网络1514 201521123097 组长 黄滢滢 网络1514 201521123095 组员 2.项目git地址 http:/ ...
- 201521123045java课程设计---定时器
#课程设计--定时器(201521123045 郑子熙) 1.团队课程设计博客链接 http://www.cnblogs.com/chendajia/p/7065730.html 2.个人负责模块或任 ...
- 网络配置之基本网络配置(cenos6)
目录: 关于IP的管理 Linux网卡的卸载与装载 配置网络接口 网络IP配置文件路由管理 路由管理命令 配置动态路由(简介) route的配置文件netstat命令IP命令 ip link 查看网络 ...