springboot上传
A. SpringBoot + SFTP 实现文件上传与下载实战
SFTP介绍
实战
1. 相关依赖(基于SpringBoot)
2. 相关配置
3. 将application.properties中配置转为一个Bean
4. 将上传下载文件封装成Service
5. 上传文件
6. 下载文件
7. 删除文件
8. 最后
B. springboot zip文件上传无法解压
解决方法如下:
1、使用xshell登录服务器。
2、安装lrzsz软件。
3、使用rz-y命令然后进行文件上传。
4、使用sz命令下载,命令格式如下,之后就可以重新试一下文件上传后能不能解压。
C. springboot上传文件出错IOException: The temporary upload location
现象:
上传excel,出现报错:
[Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.io
.IOException: The temporary upload location [/tmp/tomcat.3814974221022613431.8080/work/Tomcat/localhost/ROOT] is not valid] with root causejava.io
.IOException: The temporary upload location [/tmp/tomcat.3814974221022613431.8080/work/Tomcat/localhost/ROOT] is not valid
原因:
1.spring boot的应用服务在启动的时候,会生成在操作系统的/tmp目录下生成一个Tomcat.*的文件目录,用于"java.io.tmpdir"文件流操作
2.程序对文件的操作时:会生成临时文件,暂存在临时文件中;
linux 系统的tmpwatch 命令会删除10天未使用的临时文件;
长时间不操作,导致/tmp下面的tomcat临时文件目录被删除,且删除的文件不可恢复,上传文件时获取不到文件目录,报错
解决方案:
1.重启服务,临时方案:会重新生成tomcat目录,但是生产环境不建议如此操作;
2.1增加服务配置,自定义baseDir:
2.2启动时增加参数-Djava.io.tmpdir=自定义目录
3.修改tmpwatch 删除文件的逻辑,系统级别的命令,不建议操作
4.在网上看到有:编码的方式catch异常,生成删除的文件夹;(方法未验证)
参考:
https://github.com/spring-projects/spring-boot/issues/5009
https://github.com/spring-projects/spring-boot/issues/9616
D. SpringBoot上传文件大小设置
在做项目的时候,遇到这样的问题
org.springframework.web.multipart.MultipartException
是上传文件大小大于默认大小了,springboot默认单次上传的文件不超过1M,如果要上传更大的文件需要在 application.yml 文件中更改设置。
max-file-size 是单个文件大小
max-request-size 是设置总上传的数据大小
根据自己需求定义吧,Mb和Kb都可以,大小写也都随意
E. SpringBoot超大文件上传如何实现
不管什么技术,超大文件上传(超出一次tcp上限)都是要做分片和合并的,无非是自己做还是找控件的差别。
另外,springboot是后台接收,前端实现是由前端框架负责,比如vue。
以下是Vue+Springboot实现大文件上传的二种方式:
1、利用ElementUI的el-upload
优点:
简单方便,可以实现功能
缺点:
上传速度太慢,没有分片单线程上传1个G的文件即使在局域网也很慢
上传显示的进度条不准确,进度已经100%了,但是还需要等很久在服务端才生成完文
2、利用网络的webuploader
优点:
WebUploader是网上比较推荐的方式,分片上传大文件速度很快。
缺点:
必须依赖 jquery
不能 import 导入,只能在 index.html 里包含。
3. 利用vue-uploader
vue-uploader 是基于vue的uploader组件,缺省就是分片上传。
通过npm安装,基本流程参考github上的说明即可。
上传的基本原理就是前端根据文件大小,按块大小分成很多块,然后多线程同时上传多个块,同时调用服务端的上传接口,服务端会生成很多小块小块的文件。
所有块都上传完之后,前端再调用一个服务端的merge接口,服务端把前面收到的所有块文件按顺序组合成最终的文件。
F. spring boot 配置最大上传文件大小 在Linux环境下不生效问题
Spring Boot 默认最大request size 为10MB(1048576 bytes)。
需要设置以下两个参数
Spring Boot 1.3.x或者之前
multipart.maxFileSize=100Mb
multipart.maxRequestSize=1000Mb
Spring Boot 1.4.x或者之后
spring.http.multipart.maxFileSize=100Mb
spring.http.multipart.maxRequestSize=1000Mb
很多人设置了multipart.maxFileSize但是不起作用,是因为1.4版本以上的配置改了,详见官方文档: spring boot 1.4
如果是前端发布到nginx下的还需要配置config/nginx.config
因为nginx默认最大上传大小为1M,所以要在service-name后面加上 client_max_body_size = 10M;
参考: https://www.cnblogs.com/parasis/p/6422480.html
G. SpringBoot上传文件大小限制的配置
使用SpingBoot框架上传文件时,如果文件大小超过了1MB,会报错:
原因是SpringBoot内置的Tomcat的文件传输默认单个文件最大1M,单次请求文件总数大小为10M。
解决方法:
可以在SpingBoot的application.yml配置文件中进行修改
SpingBoot2.0版本之前:
SpingBoot2.0版本之后:
H. springboot调整上传文件大小限制
Spring Boot文件上传,文件过大导致异常the request was rejected because its size (xxx) exceeds the configured maximum (xxx)
当进行文件操作时,如果文件体积过大,会抛出上述错误。解决方案有两种,一种是通过复写MultipartConfigElement;另一种是修改配置文件application.yml中multipart相关参数。
通过setMaxRequestSize限制限制上传的多个文件的总大小,setMaxFileSize限制单个文件的最大值。
properties配置:
参考:
https://blog.csdn.net/gnail_oug/article/details/80324120
https://ld246.com/article/1592018534503
https://blog.csdn.net/qq_27886773/article/details/102695145
I. springboot多文件上传
MultipartFile提供了以下方法来获取上传文件的信息:
getOriginalFilename,获取上传的文件名字;
getBytes,获取上传文件内容,转为字节数组;
getInputStream,获取一个InputStream;
isEmpty,文件上传内容为空,或者根本就没有文件上传;
getSize,文件上传的大小。
transferTo(File dest),保存文件到目标文件系统;
同时上传多个文件,则使用MultipartFile数组类来接受多个文件上传:
//多文件上传 @RequestMapping(value = "/batch/upload", method = RequestMethod.POST)
@ResponseBody public String handleFileUpload(HttpServletRequest request){
List<MultipartFile> files = ((MultipartHttpServletRequest) request)
.getFiles("file");
MultipartFile file = null;
BufferedOutputStream stream = null;
for (int i = 0; i < files.size(); ++i) {
file = files.get(i);
if (!file.isEmpty()) {
try {
byte[] bytes = file.getBytes();
stream = new BufferedOutputStream(new FileOutputStream(
new File(file.getOriginalFilename())));
stream.write(bytes);
stream.close();
} catch (Exception e) {
stream = null;
return "You failed to upload " + i + " => " + e.getMessage();
}
} else {
return "You failed to upload " + i
+ " because the file was empty.";
}
}
return "upload successful";
}
可以通过配置application.properties对SpringBoot上传的文件进行限定默认为如下配置:
spring.servlet.multipart.enabled=true
spring.servlet.multipart.file-size-threshold=0
spring.servlet.multipart.location=
spring.servlet.multipart.max-file-size=1MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.resolve-lazily=false
enabled默认为true,既允许附件上传。
file-size-threshold限定了当上传文件超过一定长度时,就先写到临时文件里。有助于上传文件不占用过多的内存,单位是MB或KB,默认0,既不限定阈值。
location指的是临时文件的存放目录,如果不设定,则web服务器提供一个临时目录。
max-file-size属性指定了单个文件的最大长度,默认1MB,max-request-size属性说明单次HTTP请求上传的最大长度,默认10MB.
resolve-lazily表示当文件和参数被访问的时候再被解析成文件。
J. Spring boot上传文件时MultipartFile为空问题
首先我贴下我出问题的环境:
form 表单:
1.enctype="multipart/form-data" 这个要有
2.name="file" file要有name
后端
可问题来了,后端收到的file总是null。
后来研究了一会儿才发现是因为自己在@configuration定义了 MultipartResolver bean的缘故
要解决null的问题,只要把自己定义的这个 MultipartResolver bean去掉就好了
原因在于:如果你使用的springboot那么springboot会自动给你配置 MultipartResolver bean
我看到这的时候还是不明白,为什么我自己定义 MultipartResolver 就不行呢,照理说使用自己的配置而不使用springboot的自动配置是完全没问题的。
后来debug的时候我发现问题应该是出在了 MultipartFile