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

一开始以为是session过期或者文件大小受系统限制,导致的错误。

查看了系统的配置文件没有看到文件大小限制,

web.xml中seesiontimeout是30,我把它改成了120。

但还是不行,有时候10分钟就崩了。

同事说,可能是客户这里服务器网络波动导致网络连接断开,我觉得有点道理。

但是我在本地测试的时候发觉上传也失败,网络原因排除。

看了日志,错误为:

java.lang.OutOfMemoryError Java heap space

上传文件代码如下:

public static String uploadSingleFile(String path,MultipartFile file) {

if (!file.isEmpty()) {

byte[] bytes;

try {

bytes = file.getBytes();

// Create the file on server

File serverFile = createServerFile(path,file.getOriginalFilename());

BufferedOutputStream stream = new BufferedOutputStream(

new FileOutputStream(serverFile));

stream.write(bytes);

stream.flush();

stream.close();

logger.info("Server File Location="

+ serverFile.getAbsolutePath());

return getRelativePathFromUploadDir(serverFile).replaceAll("\\\\", "/");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println(e.getMessage());

}

}else{

System.out.println("文件内容为空");

}

return null;

}

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

而是在 bytes = file.getBytes(); 就报错了。

原因应该是文件太大的话,字节数超过Integer(Bytes[]数组)的最大值,导致的问题。

既然这样,把文件一点点的读进来即可。

修改上传代码如下:

public static String uploadSingleFile(String path,MultipartFile file) {

if (!file.isEmpty()) {

//byte[] bytes;

try {

//bytes = file.getBytes();

// Create the file on server

File serverFile = createServerFile(path,file.getOriginalFilename());

BufferedOutputStream stream = new BufferedOutputStream(

new FileOutputStream(serverFile));

int length=0;

byte[] buffer = new byte[1024];

InputStream inputStream = file.getInputStream();

while ((length = inputStream.read(buffer)) != -1) {

stream.write(buffer, 0, length);

}

//stream.write(bytes);

stream.flush();

stream.close();

logger.info("Server File Location="

+ serverFile.getAbsolutePath());

return getRelativePathFromUploadDir(serverFile).replaceAll("\\\\", "/");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

System.out.println(e.getMessage());

}

}else{

System.out.println("文件内容为空");

}

return null;

}

效果展示:

详细代码可以参考一下这篇文章: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超大文件上传解决办法

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  2. java+超大文件上传与下载

    ​这里先说下spring mvc 遇到的坑,就是如果文件上传时,后端这样写public String file1(HttpServletRequest request),根据request拿到的东西是 ...

  3. Java+超大文件上传

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  4. web超大文件上传

    文件夹数据库处理逻辑 publicclass DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject(); ...

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

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

  6. H5+JAVA的文件上传,断点续传

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  7. 4GB以上超大文件上传和断点续传服务器的实现

    随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求. 但是在很多情况下,平台运营方并没有大文件上传和断点续传的开发经验,往往在网上找一些简单的 ...

  8. java进行文件上传,带进度条

    网上看到别人发过的一个java上传的代码,自己写了个完整的,附带源码 项目环境:jkd7.tomcat7. jar包:commons-fileupload-1.2.1.jar.commons-io-1 ...

  9. Java Web文件上传

    参考资料:http://www.cnblogs.com/xdp-gacl/p/4200090.html 一.问题描述 Java Web文件上传需要借助一些第三方库,常用的是借助Apache的包,有两个 ...

随机推荐

  1. JDBCtemplete 模板

    package com.augmentum.oes.common; import java.sql.Connection; import java.sql.PreparedStatement; imp ...

  2. RBAC授权

    RBAC RBAC使用rbac.authorization.k8s.io API Group 来实现授权决策,允许管理员通过 Kubernetes API 动态配置策略,要启用RBAC,需要在 api ...

  3. Jmeter之JSON Path Extractor的使用(JSON-handle下载安装和使用)

    jp@gc - JSON Path Extractor和“正则表达式提取器”使用效果一样. 他的作用单一,只提取json数据 jp@gc - JSON Path Extracto 变量名自己定义,js ...

  4. VBA学习资料分享-3

    VBA创建/发送OUTLOOK邮件时怎么加上默认签名呢?用过OUTLOOK写邮件的人都知道,如果你设置了默认签名,那么在创建空白邮件的时候就会自动加上你设置的签名.根据这一特性,我们可以在用VBA创建 ...

  5. 关键字:for_each

    std::for_each 先贴cppreference中对for_each的概述: template< class InputIt, class UnaryFunction > //此处 ...

  6. oc和swift对代码的分组,方便代码查找和导航用

    OC中对代码的分组: 在OC中对代码分组的命令是#pragma mark 来实现的, 分组用的是: #pragma mark 分组名 添加分割线: #pragma mark - 如果想添加分割线的同时 ...

  7. SpringBoot整合Mybatis问题

    IDEA对xml文件处理的方式不同 在Eclipse中到dao文件与mapper.xml文件只要在同一级目录下即可 在IDEA中mapper.xml要放在resources目录下 注:resource ...

  8. React会自动把虚拟DOM数组展开

    React会自动把虚拟DOM数组展开,放在父级虚拟DOM中,这个特性还是我同事帮我解决一个问题的时候,偶然发现的. 如何将一个数据数组转换为一个虚拟DOM的数组,需要使用map,如下: const n ...

  9. Jboss未授权访问部署木马 利用exp

    查看系统名称 java -jar jboss_exploit_fat.jar -i http://www.any.com:8080/invoker/JMXInvokerServlet get jbos ...

  10. 字节流、字符串、16进制字符串转换__java

    package com.dvn.li.main; /** * @Package: * @ClassName:TypeConversion * @Description:字节流.字符串.16进制字符串转 ...