fastapi提供文件下载接口

直接上代码


from fastapi import FastAPI
from starlette.responses import FileResponse

app = FastAPI(name="monitor")

@app.get("/8011420/62020201124.iso")
async def download():
    # 处理完毕文件以后,生成了文件路径
    filename = r"C:\Users\Downloads\020201124.iso"
    return FileResponse(
        filename,  # 这里的文件名是你要发送的文件名
        filename="0201124.iso",  # 这里的文件名是你要给用户展示的下载的文件名,比如我这里叫l0201124.iso
    )

if __name__ == "__main__":
    uvicorn.run(app='apitest:app', host="0.0.0.0", port=8001, reload=False, debug=True)

文本格式不能很好显示,请见谅(附件里有比较齐整的excel表格统计) 大小类型 传输类型 api方法 文件大小 花费时间 速率byte/ms 速率mb/s 缓存数组 次数 备注 大文件 下载 download_file(group_name, remote_filename, localFile) 1073741824(约1G) 28343ms 37883 36.12804413 无 1 下载 download_file(group_name, remote_filename , downloadStream) 1073741824(约1G) 29195ms 36778 35.07423401 0 1 fastDFS的DownloadStream,FileOutputStream 下载 download_file(group_name, remote_filename , downloadStream) 1073741824(约1G) 24352ms 44092 42.04940796 2K 1 fastDFS的DowloadStream,BufferedOutputStream 下载 download_file(group_name, remote_filename , DownloadCallback) 1073741824(约1G) 24831ms 43241 41.23783112 2K 1 实现DownloadCallback,BufferedOutputStream 下载 download_file(group_name, remote_filename , DownloadCallback) 1073741824(约1G) 25922ms 41422 39.50309753 8K 1 实现DownloadCallback,BufferedOutputStream 普通文件 下载 download_file(group_name, remote_filename, localFile) 59113472(约56M) 382ms 154747 147.5782394 无 1 下载 download_file(group_name, remote_filename , downloadStream) 59113472(约57M) 369ms 160199 152.7776718 0 1 fastDFS的DownloadStream,FileOutputStream 下载 download_file(group_name, remote_filename , downloadStream) 59113472(约58M) 499ms 118702 113.2030487 2K 1 fastDFS的DowloadStream,BufferedOutputStream 下载 download_file(group_name, remote_filename , DownloadCallback) 59113472(约59M) 592ms 99853 95.22724152 2K 1 实现DownloadCallback,BufferedOutputStream 下载建议:100M内数据使用fastDFS提供的DownloadStream;大于1G的数据,使用BufferedOutputStream和DowloadStream
### 使用Python和FastAPI实现超大文件下载接口 在现代Web开发中,通过HTTP接口提供文件下载是一种常见需求。对于超大文件下载,为了避免一次性加载整个文件到内存而导致性能问题,可以采用流式传输的方式。以下是基于Python和FastAPI框架的一个解决方案。 #### 方案概述 为了支持超大文件的高效下载,可以通过`StreamingResponse`类来实现流式传输[^1]。这种方式允许服务器按需发送数据块给客户端,从而减少内存消耗并提高用户体验。 #### 示例代码 以下是一个完整的示例代码: ```python from fastapi import FastAPI, HTTPException from starlette.responses import StreamingResponse import os app = FastAPI() @app.get("/download/{file_name}") def download_large_file(file_name: str): file_path = f"./files/{file_name}" # 文件路径 if not os.path.exists(file_path): # 检查文件是否存在 raise HTTPException(status_code=404, detail="File not found") def iterfile(): # 定义生成器函数用于分块读取文件 with open(file_path, mode="rb") as file_like: while chunk := file_like.read(1024 * 1024): # 每次读取1MB的数据 yield chunk headers = { "Content-Disposition": f'attachment; filename="{os.path.basename(file_path)}"' } return StreamingResponse(iterfile(), media_type="application/octet-stream", headers=headers) ``` #### 关键点解析 - **`StreamingResponse`**: 这是Starlette库中的一个类,专门设计用来处理流式响应。它接受一个可迭代对象作为输入,并将其逐步传递给客户端。 - **分块读取**: `iterfile()` 函数实现了逐块读取文件逻辑,每次只读取固定大小(如1MB)的内容,这样即使面对GB级别的文件也不会造成内存溢出[^1]。 - **头部设置**: 设置了`Content-Disposition`头字段以便浏览器能够识别这是一个附件下载请求;同时指定了媒体类型为二进制流形式(`application/octet-stream`)。 #### 性能考量 当涉及非常庞大的文件时,除了优化服务端外还需要考虑网络带宽等因素的影响。如果目标环境存在不稳定连接,则建议加入断点续传功能以增强健壮性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值