SpringBoot上传大附件闭坑指南
一、上传大附件不经过nginx
1.首先配置文件增加属性
spring:
servlet:
multipart:
max-file-size: 2GB #默认1MB
max-request-size: 2GB #默认10MB
2.调用MultipartFile的transferTo方法上传附件至服务器。
注意:调用这个方法上传附件最大只支持2^31-1的字节文件,也就是2GB小一点。原因就是因为这个方法底层有个方法,获取字节的时候强制为int长度。
当时遇到这个问题时,第一时间想到的是修改启动参数配置,进过debug跟踪才发现是这一步报错导致。
二、上传大附件经过Nginx
1.通常我们不会将服务器真实ip暴露出来,使用Nginx做代理转发请求。当上传大附件时需要修改几个参数,不然请求会报Gateway timeout 504的错误。
client_body_buffer_size 2048m; #请求缓存区大小
client_max_body_size 2048m;#
proxy_max_temp_file_size 2048m;#临时缓冲目录允许最大内存
fastcgi_buffers 8 128k;#本地用多少多大的缓冲区读取,8是个数,128k是大小,
proxy_read_body_size 2m; #读取请求内容的超时时间
# fastcgi_buffers 可以通俗的理解为多线程,多个线程读取请求内容,
每个线程读取固定大小,跟proxy_read_body_size 成反比现象,具体配置
根据实际情况而定,并不是越大越好