上次遇到这样一个问题,客户上传高清视频(1G以上)的时候上传失败。

一开始以为是session过期或者文件大小受系统限制,导致的错误。
查看了系统的配置文件没有看到文件大小限制,
web.xml中seesiontimeout是30,我把它改成了120。
但还是不行,有时候10分钟就崩了。

同事说,可能是客户这里服务器网络波动导致网络连接断开,我觉得有点道理。
但是我在本地测试的时候发觉上传也失败,网络原因排除。

看了日志,错误为:
java.lang.OutOfMemoryError Java heap space
上传文件代码如下:


  1.     public static String uploadSingleFile(String path,MultipartFile file) {
  2.         
  3.         if (!file.isEmpty()) {
  4.             
  5.                 byte[] bytes;
  6.                 try {
  7.                     bytes = file.getBytes();
  8.                     
  9.                     // Create the file on server
  10.                     File serverFile = createServerFile(path,file.getOriginalFilename());
  11.                     BufferedOutputStream stream = new BufferedOutputStream(
  12.                             new FileOutputStream(serverFile));
  13.                     stream.write(bytes);
  14.                     stream.flush();
  15.                     stream.close();
  16.     
  17.                     logger.info("Server File Location="
  18.                             + serverFile.getAbsolutePath());
  19.  
  20.                     return getRelativePathFromUploadDir(serverFile).replaceAll("\\\\", "/");
  21.                 } catch (IOException e) {
  22.                     // TODO Auto-generated catch block
  23.                     e.printStackTrace();
  24.                     System.out.println(e.getMessage());
  25.                 }
  26.             
  27.         }else{
  28.             System.out.println("文件内容为空");
  29.         }
  30.         return null;    
  31.     }

乍一看没什么大问题,我在 stream.write(bytes); 这句加了断点,发觉根本就没走到。
而是在 bytes = file.getBytes(); 就报错了。

原因应该是文件太大的话,字节数超过Integer(Bytes[]数组)的最大值,导致的问题。
既然这样,把文件一点点的读进来即可。

修改上传代码如下:


  1.    public static String uploadSingleFile(String path,MultipartFile file) {
  2.         
  3.         if (!file.isEmpty()) {
  4.             
  5.                 //byte[] bytes;
  6.                 try {
  7.                     //bytes = file.getBytes();
  8.                     
  9.                     // Create the file on server
  10.                     File serverFile = createServerFile(path,file.getOriginalFilename());
  11.                     BufferedOutputStream stream = new BufferedOutputStream(
  12.                             new FileOutputStream(serverFile));
  13.                     int length=0;
  14.                     byte[] buffer = new byte[1024];
  15.                     InputStream inputStream = file.getInputStream();
  16.                     while ((length = inputStream.read(buffer)) != -1) {
  17.                         stream.write(buffer, 0, length);
  18.                     }
  19.                     //stream.write(bytes);
  20.                     stream.flush();
  21.                     stream.close();
  22.     
  23.                     logger.info("Server File Location="
  24.                             + serverFile.getAbsolutePath());
  25.  
  26.                     return getRelativePathFromUploadDir(serverFile).replaceAll("\\\\", "/");
  27.                 } catch (IOException e) {
  28.                     // TODO Auto-generated catch block
  29.                     e.printStackTrace();
  30.                     System.out.println(e.getMessage());
  31.                 }
  32.             
  33.         }else{
  34.             System.out.println("文件内容为空");
  35.         }
  36.         return null;    
  37.     }

效果截图展示:

详细代码可以参考一下这篇文章:http://blog.ncmem.com/wordpress/2019/08/09/java%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0/

java大文件上传的更多相关文章

  1. java 大文件上传 断点续传 完整版实例 (Socket、IO流)

    ava两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接操 ...

  2. java大文件上传解决方案

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  3. java+大文件上传解决方案

    众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路. 实现文件夹 ...

  4. java+大文件上传下载

    文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...

  5. java+大文件上传

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...

  6. JAVA大文件上传断点续传解决方案

    javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...

  7. java+大文件上传+下载

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...

  8. Java大文件上传详解及实例代码

    1,项目调研 因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面. http ...

  9. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

随机推荐

  1. http 中指定head中Content-Encoding属性为gzip 转换过程中的一些问题

    项目环境: 对接的服务放在微服务中 提供接口给应用层调用 ,微服务放需要 接受参数 并且转换成压缩格式给 第三方服务 本来以为需要自己压缩,httpclint 中已经封装好了GzipCompressi ...

  2. [Python3] 031 常用模块 shutil & zipfile

    目录 shutil 1. shutil.copy() 2. shutil.copy2() 3. shutil.copyfile() 4. shutil.move() 5. 归档 5.1 shutil. ...

  3. Spring MVC 中使用AOP 进行统一日志管理--XML配置实现

    1.介绍 上一篇博客写了使用AOP进行统一日志管理的注解版实现,今天写一下使用XML配置实现版本,与上篇不同的是上次我们记录的Controller层日志,这次我们记录的是Service层的日志.使用的 ...

  4. Spring boot 整合 shiro 出现 org.apache.shiro.UnavailableSecurityManagerException: 错误

    最开始参考的是这个 文档 但是并没有解决我的问题,因为他的配置和我的是一样(差不多)的 https://www.cnblogs.com/ginponson/p/6217057.html 然后看到此篇博 ...

  5. mybatis+mysql 返回主键

    需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如下: <insert id="i ...

  6. 从入门到自闭之python三大器--装饰器

    开放封闭原则:在不修改源代码及调用方式,对功能进行额外添加就是开放封闭原则 开放:对代码的扩展进行开发 封闭:修改源代码 装饰(额外功能) 器:工具(函数) 普通版: # print(time.tim ...

  7. 如何解决 u盘 错误0x80071AC3:请运行chkdsk并重试

    windows: 一.win+R 打开 cmd 二.确认好U盘在电脑上显示的盘符,输入代码:chkdsk G:/f (G为U盘所在盘符) Bonus:U盘一般会有文件系统,主要有NTFS.FAT16. ...

  8. 大数据计算引擎之Flink Flink状态管理和容错

    这里将介绍Flink对有状态计算的支持,其中包括状态计算和无状态计算的区别,以及在Flink中支持的不同状态类型,分别有 Keyed State 和 Operator State .另外针对状态数据的 ...

  9. JDK1.8+API+中文文档+高清完整版(不要积分 免费拿)

    JDK1.8+API+中文文档+高清完整版+CHM帮助文档 链接: https://pan.baidu.com/s/1LbdWSZ4qFjWXdJ88bXkn5w 提取码: frew 希望能帮上大家的 ...

  10. VM439:1 https://unidemo.dcloud.net.cn 不在以下 request 合法域名列表中,请参考

    在编写uni-app编写代码时,pc端获取数据正常,但是小程序端却出现以下的错误. 解决方法如下: 将相应的选项勾选