java大文件上传
上次遇到这样一个问题,客户上传高清视频(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大文件上传的更多相关文章
- java 大文件上传 断点续传 完整版实例 (Socket、IO流)
ava两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接操 ...
- java大文件上传解决方案
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...
- java+大文件上传解决方案
众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路. 实现文件夹 ...
- java+大文件上传下载
文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...
- java+大文件上传
javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...
- JAVA大文件上传断点续传解决方案
javaweb上传文件 上传文件的jsp中的部分 上传文件同样可以使用form表单向后端发请求,也可以使用 ajax向后端发请求 1.通过form表单向后端发送请求 <form id=" ...
- java+大文件上传+下载
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
- Java大文件上传详解及实例代码
1,项目调研 因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 在GoogleCode上面,代码弄下来超级不方便,还是配置hosts才好,把代码重新上传到了github上面. http ...
- 【原创】用JAVA实现大文件上传及显示进度信息
用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...
随机推荐
- 去掉有序数组中的重复元素 c/c++
去掉有序数组中的重复元素: int RemoveDuplates(int A[], int nCnt) { ; ; , j = ; i < nCnt && j < nCnt ...
- tableau分布式添加节点
参考: 两节点的安装:https://zhuanlan.zhihu.com/p/44732932https://help.tableau.com/current/server-linux/zh-cn/ ...
- Solr 4.4.0增加core
假设现在我们现在需要增加一个新的core名称为"core1" 1. 在solr_home目录新建目录core1 $ mkdir /usr/local/contentplatform ...
- Java 使用JDBC连接查询操作数据
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.sql. ...
- KNN-机器学习算法
''' Created on Sep 16, 2010 kNN: k Nearest Neighbors Input: inX: vector to compare to existing datas ...
- 如何在Ubuntu上在多个PHP版本之间切换 (for swoole)
摘要: 之前一直用Php7.0,今天想用7.2试下一些特性,安装完之后,切换回7.0却不能再使用7.0的swoole了,原来是切换方式出现了问题 一 从PHP 7.0 切换到 PHP 7.2 Apac ...
- Vue常用修饰符
Vue提供了事件修饰符用于DOM的事件处理,常用的事件修饰符有以下几个: (1). stop:阻止冒泡(通俗讲就是阻止事件向上级DOM元素传递) 点击内层div的结果: 点击外层div的结果: 修改代 ...
- vue学习【四】vuex快速入门
大家好,我是一叶,今天我们继续踩坑.今天的内容是vuex快速入门,页面传值不多的话,不建议vuex,直接props进行父子间传值就行,使用vuex就显得比较臃肿. 我们先预览一下效果,如图1所示. 图 ...
- redis、rabitmq对比
redis.rabitmq对比 原文地址 简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性 ...
- 【Java】 Java常用的几个设计模式实例
一.单例模式 public class SingletonDemo { public static void main(String[] args) { // } } class User1{//饿汉 ...