bigywater.tech
Django · 69

上传文件大小限制

想限制用户上传文件的大小,该配哪个设置?这篇把三个相关设置(FILE_UPLOAD_MAX_MEMORY_SIZE、DATA_UPLOAD_MAX_MEMORY_SIZE、DATA_UPLOAD_MAX_NUMBER_FILES)和表单校验各自管什么试出来。

没有上限
Django 没有内置的单文件大小上限,30 MiB 默认被接受
收完才检查
表单里检查 f.size 时文件已经完整上传并落盘
100
DATA_UPLOAD_MAX_NUMBER_FILES 默认值;101 个文件抛 TooManyFilesSent

没有上限

实测 · 本机执行输出
上传  1 MiB → status 200 {'files': 1, 'total': 1048576}
上传  5 MiB → status 200 {'files': 1, 'total': 5242880}
上传 30 MiB → status 200 {'files': 1, 'total': 31457280}

常见误解:DATA_UPLOAD_MAX_MEMORY_SIZE 或 FILE_UPLOAD_MAX_MEMORY_SIZE 是文件大小上限。都不是(见下)。

表单校验

实测 · 本机执行输出
  500 KiB → {'valid': True, 'errors': {}}
 1024 KiB → {'valid': True, 'errors': {}}
 1025 KiB → {'valid': False, 'errors': {'f': ['too_big']}}
 5000 KiB → {'valid': False, 'errors': {'f': ['too_big']}}

在 clean_<field> 或校验器里检查 size,给用户友好提示。想在收完之前就拒绝,要看请求头 Content-Length(可伪造,本文没有做)或在代理层限制。

三个设置各管什么

实测 · 本机执行输出
DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440  上传 10 MiB 文件的 multipart: status 200 {'files': 1, 'total': 10485760}
3 MiB 的普通表单字段(非文件):status 400 b'{"error": "RequestDataTooBig"}'
实测 · 本机执行输出
DATA_UPLOAD_MAX_NUMBER_FILES 默认 = 100
上传 100 个文件 → status 200 {'files': 100, 'total': 100}
上传 101 个文件 → status 400 {'error': 'TooManyFilesSent'}

FILE_UPLOAD_MAX_MEMORY_SIZE:文件留内存还是落盘(第 68 篇);DATA_UPLOAD_MAX_MEMORY_SIZE:非文件请求数据读进内存的上限;DATA_UPLOAD_MAX_NUMBER_FILES:一次请求最多几个文件。

分步演示:上传限制

上传大小限制
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / Python 3.14.7 / Django 6.1.1(默认用 SQLite,其它数据库会在文中注明),用 django.test.Client 或真实的本机服务器进程实测;计时用 time.perf_counter,数字每次运行会有小幅抖动。用 django.test.Client 上传(不经过真实 WSGI 服务器)
    • 没有验证:反向代理层的限制、Content-Length 预检、chunked 上传、DATA_UPLOAD_MAX_NUMBER_FIELDS 对文件上传的影响、TooManyFilesSent 最终的 HTTP 状态码(实验里视图自己转成了 400)
    京ICP备2026067502号-1京公网安备11010502063487号