首页 > 编程语言 >java实现大文件上传实例解析

java实现大文件上传实例解析

时间:2023-08-22 16:13:27浏览次数:36  
标签: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;    
    }
    
效果展示:

​编辑

​编辑

​编辑

​编辑

 

视频演示:

 

windows控件安装,,linux-deb控件包安装,linux-rpm控件包安装,php7测试,php5测试,vue-cli-测试,asp.net-IIS测试,asp.net-阿里云(oss)测试,asp.net-华为云(obs)测试,jsp-springboot测试,ActiveX(x86)源码编译,ActiveX(x64)源码编译,Windows(npapi)源码编译,macOS源码编译,Linux(x86_64)源码编译,Linux(arm)源码编译,Linux(mips-uos)源码编译,Linux(mips-kylin-涉密环境)源码编译,sm4加密传输,压缩传输,

示例下载地址

源代码文档

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

详细配置信息及思路

 


标签:java,stream,bytes,serverFile,编译,实例,file,上传,源码
From: https://www.cnblogs.com/songsu/p/17648774.html

相关文章

  • java中猜数字的小游戏
    importjava.util.Random;importjava.util.Scanner;publicclasscaishuzi{publicstaticvoidmain(String[]args){Randomrandom=newRandom();intmath=random.nextInt(100);Scannerscanner=newScanner(System.in);......
  • java-javaParse解析类的方法名称,行数等
    importcom.github.javaparser.JavaParser;importcom.github.javaparser.ast.CompilationUnit;importcom.github.javaparser.ast.PackageDeclaration;importcom.github.javaparser.ast.body.ClassOrInterfaceDeclaration;importcom.github.javaparser.ast.body.Method......
  • java怎么设置定时任务(通过Executors.newScheduledThreadPool(1)方法)
    importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.concurrent.Executors;importjava.util.concurrent.ScheduledExecutorService;importjava.util.concurrent.TimeUnit;publicclassdingshi{publicstaticvoidmain(String[]args)......
  • java实现大文件上传示例
    ​ 一、功能性需求与非功能性需求要求操作便利,一次选择多个文件和文件夹进行上传;支持PC端全平台操作系统,Windows,Linux,Mac支持文件和文件夹的批量下载,断点续传。刷新页面后继续传输。关闭浏览器后保留进度信息。支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端......
  • Java8实现联合排序
    Comparator<MyObject>combined=Comparator.comparing(MyObject::getField1,Comparator.nullsLast(Comparator.naturalOrder())).thenComparing(MyObject::getField2,Comparator.nullsLast(Comparator.naturalOrder())).thenComparing(MyObject::getF......
  • JAVA数组
    数组的定义1.数组的定义相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。2.数组的声明和创建变量类型变量名称=变量的值int[]numbers={1,2};intnumbers2[]={2,3};Java语言使用new操作符来创建数组,语法如下:int[]nu......
  • 【HarmonyOS】实现将pcm音频文件进行编码并写入文件(API6 Java)
     【关键字】音频编码、管道模式、createEncoder【写在前面】在使用API6开发HarmonyOS应用时,如何将pcm源文件进行编码并写入文件,最后生成aac文件,本文直接附上主要代码开发步骤供大家参考。【主要功能代码】importohos.media.codec.Codec;importohos.media.common.BufferInfo;im......
  • Java开发的一些小技巧
    编写清晰的代码注释:在关键地方添加合适的注释,使代码更易读、易懂。注释应该解释代码的用途、实现思路或者特殊考虑的地方,帮助其他人理解和维护代码。避免使用魔法数值:将常用的魔法数值定义为常量,以便于理解和维护代码。通过给常量起一个有意义的名称,可以提高代码的可读性和可维护性......
  • javascript学习笔记第五天
    今天的笔记functiongetusergradesum(arr=[])传递数组进入匿名函数,假设不确定数组是否会为空可以默认传一个空的数组进入,这样不会报错在匿名方法里面,return之后就直接结束函数了三元运算符好像不能同时使用两个return,例如i>l?returni:retuenl,这样子会报错return时......
  • Shopify 内容玩法之 Discounts 折扣码批量上传:matrixify
     折扣码使用的插件是:Matrixify。这个插件可以批量上传Products,Discounts等数据,可以直接使用excel模板创建数据。Discounts的excel模板,见下表:需要注意的几点:Code和Title保持一致,方便在Discounts列表查看当前折扣码的名称DiscountsValue是减掉的金额您需......