上传⼤⽂件报内存溢出错误OutOfMemory
最近⼀个项⽬要做⼤的视频⽂件的上传和下载。本来以前的项⽬框架⾥已经有现成的代码了,是⽤的springMVC⽂件上传下载的框架,但
是以前都传的⼩⽂件,没什么问题,这次需要上传⼤⽂件,就⽼是报错了。
搜索原因的时候,发现好像这套框架是⽹络⾥⾯流传得⽐较⼴的,也算是bug吧,所以贴出来了。
可惜,看不到上传⽂件的源码,(因为源码在领导那⾥,他⽼⼈家太忙)。反正最后就是各种折腾,然后到原因了的。
原因:
看了代码,FileManagerAction⾥⾯的上传⽅法,应该是先将⽂件传到tomcat服务器的⼀个临时⽂件⾥⾯,再通过spring包内置的Bytes(), descFile)⽅法,将它复制到所要上传到的⽬标⽂件夹去。
这个copy⽅法调⽤了commons-fileupload包⾥DiskFileItem类的get()⽅法,其中有⼀句代码是
byte[] fileData = new byte[(int) getSize()];
⽽这其中的getSize()⽅法的返回值是上⽂提到的copy⽅法的第⼀个参数Bytes()的值,也就是整个⽂件的⼤⼩的字节数。以前
⽂件⽐较⼩的时候倒没什么关系,new了⼀个⽐较⼩长度的byte[]还能撑住,可是⽂件⼤了的时候,就不⾏了,就内存溢出了。
到原因了要怎么解决呢,反正脑⼦是不够⽤了,所以就索性yahoo了⼀把。(没了⾕歌,也就只有yahoo了)。然后看到了这篇问答,多
少有点启发。
解决办法:
FileCopyUtils的copy⽅法有⼏个重载的⽅法,选择⽤参数为IO流的⽅法就不会报错。即是改为:
就OK 了。
问题:
get out of虽然这样解决了⼤⽂件上传的问题,但是因为⽂件⽐较⼤,copy的耗时可能会⽐较长,⽤户体验度有待改善。
===========================================================================================
另外,之前还遇到过⼀个报错SizeLimitExceedException,这个和配置⽂件⾥设置的⽂件⼤⼩有关系。在multipartResolver那个bean⾥
配置的。
搜索原因的时候,发现好像这套框架是⽹络⾥⾯流传得⽐较⼴的,也算是bug吧,所以贴出来了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论