Flask 上传文件报错 Request Entity Too Large 怎么限制大小

文章导读
Flask 上传文件出现 Request Entity Too Large 报错,通常需要在 Flask 应用配置中设置 MAX_CONTENT_LENGTH,并在 Nginx 或 WSGI 服务器中同步调整请求体限制。适用场景为 Web 服务接收大文件上传,风险边界在于设置过大可能导致服务器内存溢出。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Flask 上传文件出现 Request Entity Too Large 报错,通常需要在 Flask 应用配置中设置 MAX_CONTENT_LENGTH,并在 Nginx 或 WSGI 服务器中同步调整请求体限制。适用场景为 Web 服务接收大文件上传,风险边界在于设置过大可能导致服务器内存溢出。

先说结论:解决 413 错误需要同时检查 Flask 应用层和反向代理层的配置限制,单一修改往往无效。

  • 先确认:报错来源是 Nginx、Gunicorn 还是 Flask 应用本身
  • 先处理:在 Flask 配置 MAX_CONTENT_LENGTH 并在 Nginx 配置 client_max_body_size
  • 再验证:使用 curl 命令上传超出限制的文件测试是否拦截

命令速用版

以下是 Flask 应用和 Nginx 的核心配置片段,直接替换对应数值即可。

# Flask 应用配置 (单位:字节)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

# Nginx 配置 (http 或 server 块)
client_max_body_size 16M;

为什么会这样

Request Entity Too Large 是 HTTP 413 状态码,表示请求体超过服务器允许的最大大小。请求链路中任何一层(Nginx、WSGI 服务器、Flask 应用)设置了限制且未匹配,都会触发此报错。

默认情况下,Nginx 限制请求体为 1MB,Flask 默认不限制但受限于 WSGI 服务器缓冲区。如果只修改了 Flask 代码而 Nginx 仍保持默认,请求会在到达 Flask 之前被 Nginx 拦截。

分步处理

按照请求链路顺序,从外层代理到内层应用逐一放行。

Flask 上传文件报错 Request Entity Too Large 怎么限制大小

步骤 1:修改 Flask 应用配置

在 Flask 初始化代码中设置最大内容长度,单位为字节。例如限制 16MB:

app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

步骤 2:修改 Nginx 配置

编辑 Nginx 配置文件,在 http 或 server 块中添加 client_max_body_size。修改后需重载配置:

nginx -s reload

步骤 3:检查 WSGI 服务器

如果使用 Gunicorn 或 uWSGI,检查是否有请求体限制参数。Gunicorn 默认通常无硬性限制,但需确保 timeout 设置足够长以防大文件上传超时。

Flask 上传文件报错 Request Entity Too Large 怎么限制大小

怎么验证是否生效

使用 curl 命令构造不同大小的文件进行上传测试,观察 HTTP 状态码。

# 生成一个 10MB 测试文件
dd if=/dev/zero of=test10M.bin bs=1M count=10

# 上传测试 (假设接口为 /upload)
curl -X POST -F "file=@test10M.bin" http://your-domain/upload

验证结果判断:如果返回 413,说明限制仍生效;如果返回 200 或业务逻辑定义的 success 状态,说明限制已放宽。

常见坑

  • 单位混淆:Flask 配置 MAX_CONTENT_LENGTH 必须使用字节,Nginx 支持 K/M/G 后缀。
  • 配置层级:Nginx 配置需放在 http 或 server 块内,放在 location 块可能不生效。
  • 内存风险:调大限制会增加服务器内存占用,高并发场景需谨慎评估。

常见问题

413 错误是 Flask 抛出的吗?

不一定,Nginx 或 WSGI 服务器也会在请求到达 Flask 前抛出 413 错误。

Flask 默认有文件大小限制吗?

Flask 框架本身默认不限制大小,但受限于底层 WSGI 服务器和操作系统配置。

修改配置后需要重启服务吗?

Flask 代码修改需要重启应用进程,Nginx 配置修改需要执行 reload 命令。

参考来源

  • Flask Official Documentation, Configuration Handling, https://flask.palletsprojects.com/
  • Nginx Official Documentation, ngx_http_core_module, client_max_body_size, https://nginx.org/en/docs/