上周遇到这样一个问题,客户上传高清视频(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.     }

效果展示:

Mac控件安装教程与演示说明:

http://t.cn/AijgiFgW

http://t.cn/Aijg6z08

Linux控件安装教程与演示说明:

http://t.cn/Aijg6Lv3

http://t.cn/Aijg64k6

控件包下载:

MacOS:http://t.cn/Aijg65dZ

Linux:http://t.cn/Aijg6fRV

cab(x86):http://t.cn/Ai9pmG8S

cab(x64):http://t.cn/Ai9pm04B

xpi:http://t.cn/Ai9pubUc

crx:http://t.cn/Ai9pmrcy

exe:http://t.cn/Ai9puobe

示例下载:

jsp-eclipse:http://t.cn/Ai9p3LSx

jsp-myeclipse:http://t.cn/Ai9p3IdC

在线教程:

jsp-文件管理器教程:http://t.cn/AiNhmilv

个人博客:http://t.cn/AiY7heL0

www.webuploader.net

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

  1. java上传超大文件解决方案

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

  2. edtftpj让Java上传FTP文件支持断点续传

    在用Java实现FTP上传文件功能时,特别是上传大文件的时候,可以需要这样的功能:程序在上传的过程中意外终止了,文件传了一大半,想从断掉了地方继续传:或者想做类似迅雷下载类似的功能,文件太大,今天传一 ...

  3. Github Upload Large File 上传超大文件

    Github中单个文件的大小限制是100MB,为了能突破这个限制,我们需要使用Git Large File Storage这个工具,参见这个官方帖子,但是按照其给的步骤,博主未能成功上传超大文件,那么 ...

  4. java上传excel文件及解析

      java上传excel文件及解析 CreateTime--2018年3月5日16:25:14 Author:Marydon 一.准备工作 1.1 文件上传插件:swfupload: 1.2 文件上 ...

  5. B/S上传超大文件解决方案

    4GB以上超大文件上传和断点续传服务器的实现 随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求. 但是在很多情况下,平台运营方并没有大文件上 ...

  6. .net上传超大文件解决方案

    HTML部分 <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index.aspx. ...

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

    需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在10G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以10G来进行限制. 第一步: 前端修改 由于项目使用的是BJ ...

  8. java上传视频文件

    需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...

  9. asp.net上传超大文件

    HTML部分 <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index.aspx. ...

随机推荐

  1. 【计数DP】种树

    种树 题目描述 事实上,小X邀请两位奆老来的目的远不止是玩斗地主,主要是为了抓来苦力,替他的后花园种树……小X的后花园是环形的,他想在花园周围均匀地种上n棵树,但是奆老花园的土壤当然非同寻常,每个位置 ...

  2. 应用编排服务之ELK技术栈示例模板详解

    日志对互联网应用的运维尤为重要,它可以帮助我们了解服务的运行状态.了解数据流量来源甚至可以帮助我们分析用户的行为等.当进行故障排查时,我们希望能够快速的进行日志查询和过滤,以便精准的定位并解决问题. ...

  3. Spring Cloud Alibaba学习笔记(12) - 使用Spring Cloud Stream 构建消息驱动微服务

    什么是Spring Cloud Stream 一个用于构建消息驱动的微服务的框架 应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互, ...

  4. Jquery DataTables 服务器后端分页 Ajax请求添加自定义参数.

    项目使用AdminLTE(基于Bootstrap 二次开发的框架)作为开发框架. 使用DataTables 的时候部分页面需要传参 给后台做筛选过滤. 但是不知道怎么将DataTables的参数 和自 ...

  5. 在Windows上安装 Consul

    使用Chocolatey(Windows包管理工具)安装 官方安装说明 https://chocolatey.org/install 安装Consul 官方安装说明 https://chocolate ...

  6. ElementUI对话框(dialog)提取为子组件

    需求:在页面的代码太多,想把弹窗代码提取为子组件,复用也方便.   这里涉及到弹窗el-dialog的一个属性show-close: show-close="false"是设置不显 ...

  7. phpstom激活

    phpstom官网:https://www.jetbrains.com/phpstorm/download 激活方法:激活时选择License server 填入http://idea.imsxm.c ...

  8. unittest 运行slenium(四)---通过指定用例的形式运行用例

    一: 说明 跟数据驱动唯一的区别为用例数据获取时,及运行方式不同. 其它都基本相同,可参考https://www.cnblogs.com/xiaodingdong/p/11753220.html 二: ...

  9. 搭建jumpser堡垒机

    安装环境centos7 生产环境建议使用 1.4.8 版本 1.开始安装 echo -e "\033[31m 1. 防火墙 Selinux 设置 \033[0m" \ && ...

  10. vue项目 npm install 安装依赖 特别慢 解决办法

    使用NPM(Node.js包管理工具)安装依赖时速度特别慢,为了安装Express,执行命令后两个多小时都没安装成功,最后只能取消安装,笔者20M带宽,应该不是我网络的原因,后来在网上找了好久才找到一 ...