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

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

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

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

    1.     public static String uploadSingleFile(String path,MultipartFile file) {
      1.         
        1.         if (!file.isEmpty()) {
          1.             
            1.                 byte[] bytes;
              1.                 try {
                1.                     bytes = file.getBytes();
                  1.                     
                    1.                     // Create the file on server
                      1.                     File serverFile = createServerFile(path,file.getOriginalFilename());
                        1.                     BufferedOutputStream stream = new BufferedOutputStream(
                          1.                             new FileOutputStream(serverFile));
                            1.                     stream.write(bytes);
                              1.                     stream.flush();
                                1.                     stream.close();
                                  1.     
                                    1.                     logger.info("Server File Location="
                                      1.                             + serverFile.getAbsolutePath());
                                        1.  
                                          1.                     return getRelativePathFromUploadDir(serverFile).replaceAll("\\\\", "/");
                                            1.                 } catch (IOException e) {
                                              1.                     // TODO Auto-generated catch block
                                                1.                     e.printStackTrace();
                                                  1.                     System.out.println(e.getMessage());
                                                    1.                 }
                                                      1.             
                                                        1.         }else{
                                                          1.             System.out.println("文件内容为空");
                                                            1.         }
                                                              1.         return null;    
                                                                1.     }

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

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

                                                              修改上传代码如下:

                                                                1.    public static String uploadSingleFile(String path,MultipartFile file) {
                                                                  1.         
                                                                    1.         if (!file.isEmpty()) {
                                                                      1.             
                                                                        1.                 //byte[] bytes;
                                                                          1.                 try {
                                                                            1.                     //bytes = file.getBytes();
                                                                              1.                     
                                                                                1.                     // Create the file on server
                                                                                  1.                     File serverFile = createServerFile(path,file.getOriginalFilename());
                                                                                    1.                     BufferedOutputStream stream = new BufferedOutputStream(
                                                                                      1.                             new FileOutputStream(serverFile));
                                                                                        1.                     int length=0;
                                                                                          1.                     byte[] buffer = new byte[1024];
                                                                                            1.                     InputStream inputStream = file.getInputStream();
                                                                                              1.                     while ((length = inputStream.read(buffer)) != -1) {
                                                                                                1.                         stream.write(buffer, 0, length);
                                                                                                  1.                     }
                                                                                                    1.                     //stream.write(bytes);
                                                                                                      1.                     stream.flush();
                                                                                                        1.                     stream.close();
                                                                                                          1.     
                                                                                                            1.                     logger.info("Server File Location="
                                                                                                              1.                             + serverFile.getAbsolutePath());
                                                                                                                1.  
                                                                                                                  1.                     return getRelativePathFromUploadDir(serverFile).replaceAll("\\\\", "/");
                                                                                                                    1.                 } catch (IOException e) {
                                                                                                                      1.                     // TODO Auto-generated catch block
                                                                                                                        1.                     e.printStackTrace();
                                                                                                                          1.                     System.out.println(e.getMessage());
                                                                                                                            1.                 }
                                                                                                                              1.             
                                                                                                                                1.         }else{
                                                                                                                                  1.             System.out.println("文件内容为空");
                                                                                                                                    1.         }
                                                                                                                                      1.         return null;    
                                                                                                                                        1.     }

                                                                                                                                        效果截图展示:

                                                                                                                                        详细代码可以参考一下这篇文章: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. json得回顾

                                                                                                                                        2. shell脚本一键部署nginx

                                                                                                                                          一键部署nginx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ...

                                                                                                                                        3. centoss7下将命令加开机服务

                                                                                                                                          https://www.cnblogs.com/hxun/p/11075755.html

                                                                                                                                        4. 20 亿的 URL 集合,如何快速判断其中一个?

                                                                                                                                          假设遇到这样一个问题:一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M ...

                                                                                                                                        5. Kettle的Kitchen和Span

                                                                                                                                          Kitchen——工作(job)执行器 (命令行方式) -rep  : Repository name   任务包所在存储名    -user  : Repository username   执行人 ...

                                                                                                                                        6. Codeforces - 1203D2 - Remove the Substring (hard version) - 双指针

                                                                                                                                          https://codeforces.com/contest/1203/problem/D2 上次学了双指针求两个字符串之间的是否t是s的子序列.但其实这个双指针可以求出的是s的前i个位置中匹配t的最 ...

                                                                                                                                        7. thinkphp5 安装

                                                                                                                                          thinkphp 5开始可以使用composer安装 所以在安装thinkphp5.1之前,我们先安装composer ,下载地址:https://www.phpcomposer.com/ 安装完co ...

                                                                                                                                        8. 缓存---LRU算法实现

                                                                                                                                          2.LRU   以下是基于双向链表+HashMap的LRU算法实现,对算法的解释如下:   设置一个map存放对应的键和值,同时设置一个双向链表,来保存最近最久未使用的关系,如果访问一个键,键存在于m ...

                                                                                                                                        9. sql server 函数详解(1)字符串函数

                                                                                                                                          ASCII()函数 CHAR()函数 LEFT()函数 RIGHT()函数 LTRIM()函数 RTRIM()函数 STR()函数 字符串逆序的函数REVERSE() 计算字符串的长度函数LEN(st ...

                                                                                                                                        10. CTP报单参数详解

                                                                                                                                          交易所代码 产品类型 业务类型 价格类型 指令类型 价格类型 OrderPriceType 有效期类型 TimeCondition 成交量类型 VolumeCondition 备注 CZCE 郑商所 ...