讲师中心 微信公众号
AI工具推荐 视频效率加速

FastAPI怎么限制上传文件的大小和格式类型

轻杰酱_3077

轻杰酱_3077

发布时间:2026-10-05 08:44:29

|

997人浏览过

|

来源于php中文网

原创

FastAPI 用 File() 的 max_size 参数可轻量拦截超限上传,单位字节,超限返回413;content_type校验比后缀更可靠;手动读取后需 seek(0);大文件应避免 await file.read() 防OOM。

fastapi怎么限制上传文件的大小和格式类型

用 File() 的 max_size 参数直接限制大小

FastAPI 内置支持通过 File() 的 max_size 参数做上传大小拦截,这是最轻量、最推荐的第一道防线。

它在 Starlette 的 form 解析层就生效,不等文件内容真正读入内存或临时文件,就能拒绝超限请求,避免资源浪费。

  • max_size 单位是字节,比如限制 10MB 就写 max_size=10*1024*1024
  • 超出时自动返回 413 Payload Too Large,无需手动抛异常
  • 注意:该参数只对 UploadFile 类型字段有效,不能用于普通 str 或 bytes
  • 如果同时用了 File(max_size=...) 和自定义校验逻辑,max_size 会先触发,后续逻辑根本不会执行

校验 content_type 比仅看后缀更可靠

用户可以随意改文件后缀,所以单靠 filename.rsplit('.', 1)[1] 判断类型容易绕过。应优先检查 UploadFile.content_type 字段,它是 HTTP 请求中真实的 MIME 类型(由浏览器或客户端生成)。

例如图片上传,允许 "image/jpeg"、"image/png",但拒绝 "text/plain" 即使后缀是 .jpg。

Fastapi Code Review
Fastapi Code Review

审查 FastAPI 代码的路由模式、依赖注入、验证和异步处理器。适用于审查 FastAPI 应用、检查 APIRouter 配置、依赖注入等。

下载
  • 白名单建议用集合: ALLOWED_TYPES = {"image/jpeg", "image/png", "application/pdf"}
  • 不要用 if file.content_type.startswith("image/") 这类宽松匹配,可能放行 image/svg+xml 等非预期类型
  • 如果业务强依赖后缀(如某些老系统),可双校验:先验 content_type,再辅以后缀检查,但后者必须和前者一致(比如 content_type=="image/png" 时,后缀必须是 .png)

手动读取前必须 seek(0),否则后续读不到内容

很多开发者在 validate_file() 里调用 file.file.read() 做大小或内容校验后,忘了重置文件指针,导致后续保存时 shutil.copyfileobj(file.file, buffer) 读到空数据。

这是因为 UploadFile.file 是一个类似 SpooledTemporaryFile 的对象,读一次指针就跑到末尾了。

  • 每次手动 read() 后,务必加 file.file.seek(0)
  • 更安全的做法是:校验用 await file.read()(异步方式),它会自动管理缓冲;之后再用 await file.seek(0) 重置(UploadFile 支持该方法)
  • 如果用同步 shutil.copyfileobj() 保存,确保前面没混用异步 read(),否则可能引发 RuntimeError:「Event loop is closed」

大文件上传慎用 await file.read()

当 max_size 设为 500MB,而用户真传了个 499MB 文件时,await file.read() 会把整个文件加载进内存——不是流式处理,而是全量载入。

这极易触发 OOM(内存溢出),尤其在容器或低配服务器上。

  • 对明确的大文件场景(如视频、数据库备份),应跳过 File(max_size=...),改用原始 request body 流式读取
  • 即不用 UploadFile,而用 Request 接收,配合 iter_chunks() 分块校验 size 和 type
  • 此时 MIME 类型需从 request.headers.get("content-type") 解析 multipart boundary,再逐块提取 header 判断,复杂度显著上升
实际部署时,max_size 和 content_type 校验能覆盖 95% 的常规需求;但只要接口暴露给不可信用户,就必须意识到:所有前端限制都可被绕过,服务端校验不能少,而内存安全边界往往比格式检查更容易被忽略。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

相关专题

更多
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

119

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

514

2026.02.06

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

496

2026.05.09

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

419

2026.06.16

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

80

2026.09.30

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

40

2026.09.30

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

40

2026.09.30

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

60

2026.09.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
FastAPI SQL数据库实战文档
FastAPI SQL数据库实战文档

共0课时 | 0人学习

FastAPI官方教程文档
FastAPI官方教程文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn