bigywater.tech
Flask · 36

多文件上传

上传一批文件时,Flask 里怎么取?同名的文件会不会互相覆盖?上传多少个会被拒?这篇从 getlist 开始一一验证。

3
本篇 getlist 一次取到的文件数
1 个
两个用户上传同名文件、不加前缀时目录里剩下的文件数
413
multipart 部分数超过 MAX_FORM_PARTS 时的状态码

getlist

实测 · 本机执行输出
  {'count': 3, 'first_via_get': 'a.txt', 'form': {'note': ['hi']}, 'keys': ['docs'], 'names': ['a.txt', 'b.txt', 'c.txt'], 'sizes': [3, 5, 1]}

上一篇:文件上传与 FileStorage;下一篇:上传文件大小限制。

files.lists()

实测 · 本机执行输出
  {'avatar': ['me.png'], 'docs': ['d1.pdf', 'd2.pdf']}

同名文件覆盖

实测 · 本机执行输出
  两次上传同名文件后目录里: ['report.pdf'] | 内容: b'USER-2 data'
  加随机前缀后目录里: ['report.pdf(前缀8位)', 'report.pdf(前缀8位)'] | 文件数 2

数量上限

实测 · 本机执行输出
  MAX_FORM_PARTS=6:3 个文件 + 1 个普通字段 → 200
  MAX_FORM_PARTS=6:5 个文件 + 1 个普通字段 → 200
  MAX_FORM_PARTS=6:8 个文件 + 1 个普通字段 → 413

真实 HTTP

实测 · 本机执行输出
  → 1.txt:3,2.txt:6,3.txt:1

分步演示

多文件上传
本步的对象

    本文用到的工具与边界

    • 本机 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,数字每次运行会有小幅抖动
    • 没有验证:并发保存同一文件名时的竞态(只演示了顺序覆盖)、浏览器 实际发出的字段名、目录下文件数量巨大时的性能、随机前缀的碰撞概率(只用了 8 位十六进制)
    京ICP备2026067502号-1京公网安备11010502063487号