首页 > 编程语言 >Java大文件上传详解及实例代码

Java大文件上传详解及实例代码

时间:2023-10-16 15:35:35浏览次数:32  
标签:Java stream bytes serverFile 详解 file new 上传

前言:

上周遇到这样一个问题,客户上传高清视频(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/2023/10/16/java%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e8%af%a6%e8%a7%a3%e5%8f%8a%e5%ae%9e%e4%be%8b%e4%bb%a3%e7%a0%81-2/

欢迎入群一起讨论

 

 

标签:Java,stream,bytes,serverFile,详解,file,new,上传
From: https://www.cnblogs.com/songsu/p/17767409.html

相关文章

  • java -jar命令及SpringBoot通过java -jav启动项目的过程
    本篇文章将为大家讲述关于SpringBoot项目工程完成后,是如何通过java-jar命令来启动的,以及介绍java-jar命令的详细内容,对SpringBootjava-jav启动过程感兴趣的朋友跟随小编一起看看吧本篇文章将为大家讲述关于SpringBoot项目工程完成后,是如何通过java-jar命令来启动的......
  • Java 常用中间件
    Java常用中间件1、网关Nginx、Kong、Zuul、Gateway2、缓存Redis、MemCached、OsCache、EhCache3、搜索ElasticSearch、Solr4、熔断Hystrix、resilience4j5、负载均衡DNS、F5、LVS、Nginx、OpenResty、HAproxy6、注册中心Nacos、Eureka、Zookeeper、Redis、Etcd、Cons......
  • Typora的图片上传教程
    Typora的图片上传教程图片上传准备1.图床开源工具使用自行上传图片是很麻烦的,所以借用一个开源图床工具PicGo来使用作为图片上传工具......
  • oracle-rownum详解
    Oracle中的rownum用法详解:rownum是Oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,返回的第二行分配的是2,这个为字段可以用于限制返回查询的总行数,且rownum不可以以任何表的名称作为前缀。 1.rownum对于等于某值的查询条件:如果想找到第一条查询数据,可以......
  • java实现大文件传输
    简介在现代互联网中,我们经常需要传输大文件,例如视频、音频或者大型数据文件。传输大文件需要考虑诸多因素,例如网络延迟、带宽限制和传输安全性。在本文中,我们将介绍如何使用Java实现大文件传输,并提供相应的代码示例。文件传输协议在进行大文件传输之前,我们需要选择合适的传输协议......
  • java导出占位符word模板
    实际项目中,便于维护模板,采用直接word里面制作占位符来导出更为直观,而不是将word做成tpl模板。使用XWPFDocument(这种解析xlsx或者docx)和HWPFDocument(这种解析xls或者doc)。代码如下:写磁盘代码:点击查看代码//创建Word模板文件:在开始代码编写之前,我们需要准备一个Wor......
  • java-springboot和servlet的项目搭建
    1.404->启动tomcat->tomcat闪退->配置jre全局环境,重启电脑->8080端口被占用->下载太多tomcat->重新配置->还是被占用->命令行找netstat-ano|findstr80得到PID,在任务管理器找到(用PID排序会更好找)是一个java.exe,结束进程。->成功运行2.入口类3.mysql命令不生效->因为没加分号(我......
  • 组合模式--Java实现
    画类图以文件夹浏览为例;具体代码实现//AbstractFile.javapackageorg.example.design008;publicabstractclassAbstractFile{publicabstractvoidadd(AbstractFileelement);publicabstractvoidremove(AbstractFileelement);publicabstractvoid......
  • 自邮之翼Java Web开发入门学习之旅 阶段一
    这个阶段的任务是“完成开发环境的安装和配置,并基于JSP实现一个“HellotheWorld”页面。主要使用的开发环境为:IntellijJava,进行开发前需要完成的环境配置如下:·配置java环境(JDK17)·配置maven环境(apache-maven-3.9.4)·配置Tomcat环境(apache-tomcat-10.1.13)以上均需要......
  • Javaweb后端
    Javaweb后端目录Javaweb后端MavenHTTP请求响应请求(补充)xml文件分层解耦三层架构IOC/DI入门IoC控制反转DI依赖注入MySQL事务索引分页查询MyBatis快速入门数据库连接池Lombok增删改查删除新增查询条件查询xml映射文件动态sql案例部门管理分页查询文件上传阿里云OSS配置文件参数......