You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过Nginx反向代理向Tomcat上传Multipart文件的问题排查

解决方案:Nginx转发文件上传请求到Tomcat返回400的问题

我之前处理过完全一致的场景,结合你给出的错误信息Unable to process parts as no multi-part configuration has been provided,以及直接访问Tomcat上传正常的情况,问题肯定出在Nginx的转发环节——要么是multipart请求的关键头信息没被正确传递,要么是Nginx默认的请求体大小限制截断了上传请求,导致Tomcat无法识别这是一个合法的文件上传请求。下面是具体的解决步骤:

1. 确保Nginx完整传递multipart请求头

在你的Nginx配置的location /Tomcat块中,添加以下配置,保证客户端发送的multipart请求标识能完整到达Tomcat:

proxy_set_header Content-Type $http_content_type;
proxy_set_header Content-Length $http_content_length;
# 确认请求体和请求头都被完整转发(默认是开启状态,但若之前有修改需检查)
proxy_pass_request_body on;
proxy_pass_request_headers on;

Tomcat需要通过Content-Type中的multipart/form-data标识来识别文件上传请求,这些配置能避免Nginx在转发时丢失或篡改这类关键信息。

2. 配置Nginx支持大文件上传

Nginx默认限制客户端请求体最大为1MB,如果你的上传文件超过这个大小,Nginx会直接截断请求,Tomcat收到不完整的请求后就会抛出你遇到的错误。在http块或者对应的server块中添加以下配置:

# 允许的最大请求体大小,根据业务需求调整,比如100M
client_max_body_size 100M;
# 请求体缓冲区大小,适配大文件上传
client_body_buffer_size 128k;
# 延长请求体超时时间,防止大文件上传中途超时
client_body_timeout 120s;

3. 兜底检查Tomcat的multipart配置(可选)

虽然你直接访问Tomcat上传正常,但可以确认下Tomcat的multipart配置是否匹配当前需求,避免后续出现其他问题:

  • 如果是Spring Boot项目,在application.properties中添加:
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=100M
spring.servlet.multipart.max-request-size=100M
  • 如果是传统Tomcat项目,在web.xml的对应Servlet中添加multipart-config配置:
<servlet>
    <servlet-name>你的REST服务Servlet名称</servlet-name>
    <servlet-class>对应的Servlet类(比如Spring的DispatcherServlet)</servlet-class>
    <multipart-config>
        <max-file-size>104857600</max-file-size> <!-- 100MB -->
        <max-request-size>104857600</max-request-size>
        <file-size-threshold>0</file-size-threshold>
    </multipart-config>
</servlet>

4. 重启服务使配置生效

修改完配置后,分别重启Nginx和Tomcat:

# 重启Nginx(根据你的系统环境调整命令)
sudo systemctl restart nginx
# 重启Tomcat
./tomcat/bin/shutdown.sh
./tomcat/bin/startup.sh

完成以上步骤后,应该就能通过Nginx正常上传文件了。

内容的提问来源于stack exchange,提问作者fashuser

火山引擎 最新活动