bigywater.tech
Flask · 37

上传文件大小限制

上传文件大小怎么限制?超限时服务器读了多少?限制什么时候检查?chunked 上传也受限吗?这篇既用 test client 也用真实的 30 MB 上传来验证。

413
超过 MAX_CONTENT_LENGTH 时的状态码
1048576
chunked 30 MB 上传时视图 get_data() 实际拿到的字节数(限制 1 MB)
None
MAX_CONTENT_LENGTH 的默认值

默认不限制

实测 · 本机执行输出
  默认配置: {'MAX_CONTENT_LENGTH': None, 'request.max_content_length': None}
  设成 1000 后: {'MAX_CONTENT_LENGTH': 1000, 'request.max_content_length': 1000}
  POST /raw 正文    500 字节 → 200 {"len":500}
  POST /raw 正文   1000 字节 → 200 {"len":1000}
  POST /raw 正文   1001 字节 → 413 <!doctype html> <html lang=en> <title>413 Request Entity Too Large</ti
  POST /raw 正文 100000 字节 → 413 <!doctype html> <html lang=en> <title>413 Request Entity Too Large</ti

上一篇:多文件上传;下一篇:secure_filename() 的安全处理。

检查发生的时机

实测 · 本机执行输出
  视图完全不读请求体,发 100000 字节(超限)→ 200
  multipart 上传 5000 字节的文件 → 413 {'code': 413, 'error': 'RequestEntityTooLarge'}

按请求设置

实测 · 本机执行输出
  全局不限制,视图里设 request.max_content_length = 100,发 500 字节 → 413
  发 50 字节 → 200 {'len': 50}

真实上传 30 MB

实测 · 本机执行输出
  500 KB(限制内)              → 200 上传 512213 字节 0.003929s
  30 MB(超限)                → 413 上传 720896 字节 0.001143s
  30 MB,视图不读请求体            → 200 上传 393216 字节 0.000960s
  30 MB chunked(无 CL)    → 200 上传 1791044 字节 0.002573s | 响应正文:'1048576'

413 响应

实测 · 本机执行输出
  自定义 413 处理器: 413 {'error': 'payload too large', 'limit': 10}
  默认 413 页: 413 <!doctype html> <html lang=en> <title>413 Request Entity Too Large</title> <h1>Request Entity Too Large</h1> <

分步演示

上传大小限制
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动
    • 没有验证:Nginx 的 client_max_body_size 与 Flask 限制的先后(见第 174 篇)、uWSGI 对请求体的缓冲行为、chunked 请求超限时是否有更严格的设置、curl 在服务端提前关闭连接时的重试行为、MAX_FORM_MEMORY_SIZE 与 MAX_CONTENT_LENGTH 的关系
    • chunked 上传「截断而不报错」是本机 Flask 3.1.3 + Werkzeug 3.1.9 + gunicorn 26.2.0 下的一次实测,没有查证这是否是设计行为
    京ICP备2026067502号-1京公网安备11010502063487号