200425-文件上传问题汇总

文件上传问题汇总

大文件上传问题

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
2
3
4
Syntax: client_max_body_size size;
Default:
client_max_body_size 1m;
Context: http, server, location

调整 client_max_body_size 为50M,重新加载即可。

单独部署tomcat

问题原因:

Tomcat中存在限制上传文件的情况,这是因为POST的长度是有限制的

默认值:

默认为2MB。

解决方式:

tomcat目录下的conf文件夹下,server.xml 文件中以下的位置中添加maxPostSize参数

1
2
3
4
5
6
<Connector port="8081"  
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="utf-8"
maxPostSize="0"/>

当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
    2
    multipart.maxFileSize
    multipart.maxRequestSize
  • Spring Boot 1.4.x and 1.5.x

    1
    2
    spring.http.multipart.maxFileSize
    spring.http.multipart.maxRequestSize
  • Spring Boot 2.x

    1
    2
    spring.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
2
3
4
# 改为30M
set global max_allowed_packet = 3*1024*1024*10;
# 重启DB连接生效
show VARIABLES like '%max_allowed_packet%';

参考资料

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×