当前位置: 首页 > article >正文

【FastAPI】文件响应方法StreamingResponse和 FileResponse的用法和场景

在 FastAPI 中,StreamingResponseFileResponse 是用于处理文件响应的两种常见方法。它们在不同的场景中有各自的用途。下面详细介绍这两者的用法和适用场景。

1. FileResponse

FileResponse 是用来发送现有文件作为响应的。它适用于发送静态文件,如图片、PDF 文档、音频、视频等。FileResponse 会直接读取指定路径的文件,并将其作为 HTTP 响应返回给客户端。

用法:
from fastapi import FastAPI
from fastapi.responses import FileResponse

app = FastAPI()

@app.get("/download-file")
def download_file():
    file_path = "path/to/your/file.txt"
    return FileResponse(file_path, media_type="application/octet-stream", filename="downloaded_file.txt")
适用场景:
  • 下载现有的静态文件,如文档、图片、视频等。
  • 不需要对文件进行逐步处理或生成,文件已经存在于服务器的文件系统中。

2. StreamingResponse

StreamingResponse 适用于当文件内容是动态生成的或需要逐步读取数据进行响应的场景。它通过“流式”将数据逐步发送给客户端,而不是一次性加载整个文件到内存中。这对于处理大文件或实时生成数据的场景非常有用。

用法:
from fastapi import FastAPI
from fastapi.responses import StreamingResponse

some_file_path = "large-video-file.mp4"
app = FastAPI()


@app.get("/")
def main():
    def iterfile():  # (1)
        with open(some_file_path, mode="rb") as file_like:  # (2)
            yield from file_like  # (3)

    return StreamingResponse(iterfile(), media_type="video/mp4")
适用场景:
  • 需要动态生成或逐步加载数据,例如大文件、日志、实时数据等。
  • 避免一次性将整个文件加载到内存中,以节省内存资源。
  • 实现一些实时数据推送的场景,如视频流、日志流等。

总结

  • FileResponse 适合返回已经存在的文件,通常是用于文件下载或返回静态资源。
  • StreamingResponse 则更适合返回动态生成或需要逐步传输的大型文件,或用于推送实时数据流。

这两者根据文件的大小、是否动态生成以及性能需求来选择使用。


http://www.kler.cn/a/299431.html

相关文章:

  • 【项目初始化】
  • 39【内存条与硬盘的架构逻辑】
  • 深入理解Flexbox:弹性盒子布局详解
  • 列表(列表是什么)
  • AI大模型开发原理篇-8:Transformer模型
  • 使用Ollama本地部署DeepSeek R1
  • 在IDEA中如何创建web项目?——不使用Archetype
  • DC-DC恒频电流模式3A降压转换器,小体积封装
  • Android生成C++ AIDL
  • FastAPI 深入学习:利用__call__方法实现动态依赖项
  • 【腾讯云】AI驱动的数据库TDSQL-C如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图
  • 自己看---华为od--构成正方形的数量
  • 神经网络的可解释性理论及工具
  • timedatectl /date /hwclock 命令
  • Rust使用之【宏】
  • Vue(7)——工程化开发
  • 基于SpringBoot+Vue的学生成绩管理系统
  • [苍穹外卖]-04菜品管理接口开发
  • Node.js入门与生态全解析:包管理与构建工具详解
  • 从代码层面说算子链断链的方式
  • 【OJ刷题】双指针问题
  • 101 个 React 技巧和窍门
  • TP发邮件的功能如何实现?tp框架发送邮件?
  • 在Ubuntu上部署 Misskey 服务器
  • Spring 源码解读:使用FactoryBean创建复杂对象的实现
  • RK3576芯片在智能家居里中型智慧屏产品的应用方案分析