在 FastAPI 中,StreamingResponse
和 FileResponse
是用于处理文件响应的两种常见方法。它们在不同的场景中有各自的用途。下面详细介绍这两者的用法和适用场景。
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
则更适合返回动态生成或需要逐步传输的大型文件,或用于推送实时数据流。
这两者根据文件的大小、是否动态生成以及性能需求来选择使用。