首页 > 编程语言 >JAVA WEB超大文件上传解决方案:分片断点上传(一)

JAVA WEB超大文件上传解决方案:分片断点上传(一)

时间:2023-03-16 17:23:37浏览次数:60  
标签:B超 JAVA stream bytes serverFile 源码 file 上传

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

 

示例下载地址:

源代码文档

asp.net源码下载jsp-springboot源码下载jsp-eclipse源码下载jsp-myeclipse源码下载php源码下载csharp-winform源码下载vue-cli源码下载c++源码下载

详细配置信息及思路

 

 

 

标签:B超,JAVA,stream,bytes,serverFile,源码,file,上传
From: https://www.cnblogs.com/songsu/p/17223439.html

相关文章

  • Dcat admin 多文件上传,七牛云云端上传
    进入官网  DcatAdmin-Php后台开发框架   这里要选择1.x下面来安装框架      安装完laravel之后,需要修改.env文件,设置数据库链接设置正确 ......
  • WebUploader 文件夹上传下载解决方案
    ​ IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头。 一. 两个必要响应头Accept-Ranges、ETag     ......
  • JavaScript 实现异步任务循环顺序执行
    JavaScript实现异步任务循环顺序执行需求场景:数组的元素作为异步任务的参数,循环遍历该数组,并执行异步任务。一、错误的实现//异步任务的参数数组constarr=[1,2,......
  • JavaScript 文件夹上传下载解决方案
    ​ 以ASP.NETCoreWebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API,包括文件的上传和下载。 准备文件上传的API #region 文件上传......
  • commons-io的Java文件处理常用方法
    Java文件处理常用方法归纳整理一些常用的处理文件的方法JavaApacheFileUtilsMaven依赖引入<dependency><groupId>commons-io</groupId><artif......
  • 【JavaScript】用Object.definePropety()对对象的属性实现监听和修改_TA远方的博客
    本文中会讲到对象函数Object.defineProperty(),也许你对这个函数比较陌生,要知道这个函数用途可大了,等自己想到它的时候,就知道它的重要性。文章目录举个栗子赋值其它......
  • Java字符串基础练习
    请编写程序,由键盘录入一个字符串,统计字符串中英文字母和数字分别有多少个。比如:Hello12345World中字母:10个,数字:5个。练习提示:1、用Scanner实现键盘录入一个字符串2、要统......
  • 【Java】CompletableFutureTimeoutUtils
    CompletableFutureTimeoutforJDK8importlombok.NonNull;importjava.util.ArrayDeque;importjava.util.Deque;importjava.util.concurrent.*;importjava.uti......
  • Java for循环介绍
    基本语法语法格式:for(①初始化部分;②循环条件部分;④迭代部分){         ③循环体部分;}执行过程:①-②-③-④-②-③-④-②-③-④-.....-②图示:说明:......
  • JavaScript随笔
    数据类型简单数据类型(原始类型):Undefined、Null、Boolean、Number、String和Symbol复杂数据类型:Object深拷贝与浅拷贝浅拷贝Object.assignArray.prototype.slice()......