文件上传问题汇总
大文件上传问题
nginx
问题原因:
用nginx来做webserver的时,上传大文件时需要特别注意client_max_body_size这个参数,否则会中断在nginx的请求中是无法记录到访问日志。单在error日志中应该有提示
1 | [error] 104407#104407: *509585 client intended to send too large body: 1062648 bytes |
默认值:
nginx中默认 client_max_body_size 大小为1M
解决方式:
1 | Syntax: client_max_body_size size; |
调整 client_max_body_size 为50M,重新加载即可。
单独部署tomcat
问题原因:
Tomcat中存在限制上传文件的情况,这是因为POST的长度是有限制的
默认值:
默认为2MB。
解决方式:
tomcat目录下的conf文件夹下,server.xml 文件中以下的位置中添加maxPostSize参数
1 | <Connector port="8081" |
当maxPostSize<=0时,POST方式上传的文件大小不会被限制。
注意:maxPostSize参数只有当request的Content-Type为“application/x-www-form-urlencoded”时起作用。
内置tomcat
问题原因:
前端页面表单输入数据较多,包含多个文本、多张图片,在数据未压缩的情况下,最终上传失败。
会出现如下的报错信息:
1 | java.lang.IllegalStateException: The multi-part request contained parameter data (excluding uploaded files) that exceeded the limit for maxPostSize set on the associated connector |
即:请求数据量过大,超出了最大阈值。
默认值:
maxFileSize 默认 1M
maxRequestSize 默认 10M
解决方式:
修改Spring Boot内置Tomcat的maxPostsize值,在application.yml配置文件中添加以下内容:
maxFileSize(设置单个文件的大小)
maxRequestSize 设置单次请求的文件的总大小
根据不同版本,对应的设置值不一样
Spring Boot 1.3.x and earlier
1
2multipart.maxFileSize
multipart.maxRequestSizeSpring Boot 1.4.x and 1.5.x
1
2spring.http.multipart.maxFileSize
spring.http.multipart.maxRequestSizeSpring Boot 2.x
1
2spring.servlet.multipart.maxFileSize
spring.servlet.multipart.maxRequestSize
Mysql
问题原因:
解决了应用服务器请求数据量过大问题后,在下一步写入DB时又遇到了类似问题,超出了数据库中最大允许数据包默认配置值。
1 | Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (16800061 > 16777216). You can change this value on the server by setting the max_allowed_packet’ variable. |
默认值:
默认为4MB。
解决方式:
修改DB的max_allowed_packet值:
1 | 改为30M |