上次遇到这样一个问题,客户上传高清视频(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. 【miscellaneous】华为智能视频监控系统设计解决方案

    [导读] 近年来,随着经济的快速增长.社会的迅速进步,校园.工厂园区.中小企业.楼宇等领域对安全防范和现场记录报警系统的需求与日俱增,视频监控在工作.生活各方面得到了非常广泛的应用. 1.中小型视频监 ...

  2. Linux系统管理和调优(内存、CPU、磁盘IO、网络)

    系统管理 Author:Rich七哥 查看 CPU 负载相关工具,找出系统中使用 CPU 最多的进程 查看 Memory 运行状态相关工具,找出系统中使用内存最多的进程 查看 IO 运行状态相关工具, ...

  3. spring boot-4.配置文件

    官方文档的23.4章节介绍了关于配置文件的内容 springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的 ...

  4. WebMagic 抓取图片并保存至本地

    1.近期接触到java 爬虫,开源的爬虫框架有很多,其中WebMagic 是国产的,文档也是中文的,网上资料很多,便于学习,功能强大,可以在很短时间内实现一个简单的网络爬虫.具体可参考官网 http: ...

  5. CSS3与页面布局学习总结——多种页面布局

    一.负边距与浮动布局 1.1.负边距 所谓负边距就是margin取负值的情况,如margin:-40px:margin-left:-100%.当一个元素与另一个元素margin取负值时将拉近距离.常见 ...

  6. gRPC编译教程

    windows平台的编译 一.编译openssl ① 安装perl(可以使用ActivePerl),执行perl Configure VC-WIN64A no-asm .在这里解释一下参数含义,VC- ...

  7. luogu P4548 [CTSC2006]歌唱王国

    传送门 这题\(\mathrm{YMD}\)去年就讲了,然而我今年才做(捂脸) 考虑生成函数,设\(f_i\)表示最终串长为\(i\)的概率,其概率生成函数为\(F(x)=\sum f_ix^i\), ...

  8. 什么是RESTful API、WSGI、pecan

    RESTful API REST的全称是Representational State Transfer(表征状态转移), 是Roy Fielding在他的博士论文Architectural Style ...

  9. AndroidStudio Gradle手动下载和安装

    操作流程概述: 下载好的压缩包和解压后的文件夹复制到gradle-5.5.1-all --->97z1ksx6lirer3kbvdnh7jtjg文件夹下,将gradle-5.5.1-all.zi ...

  10. dedecms织梦无法保存栏目内容的解决方法

    最近使用DedeCms5.3和DedeCms5.5遇到了一个不可思议的问题:在添加栏目时IE内核的浏览器无法保存栏目内容.到网上搜索了半天没找到解决方法,查看DedeCms官方搜索到的结果是“栏目内容 ...