FastAPI如何返回文件字节流?并且附带一些json参数

文章目录

  • GET方法 StreamingResponse
  • POST方法 StreamingResponse
  • 其他
  • 关于压缩

GET方法 StreamingResponse

服务器:

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from starlette.responses import FileResponse
from pydantic import BaseModelapp = FastAPI()# 创建一个 Base 模型,用于表示其他的 JSON 信息
class AdditionalInfo(BaseModel):message: strstatus: str@app.get("/get_demo_image_with_json")
async def get_demo_image_with_json():# 从文件中读取字节流file_path = "face.png"file_like = open(file_path, mode="rb")# 模拟其他的 JSON 信息json_info = AdditionalInfo(message="Image loaded successfully", status="OK")# 使用 StreamingResponse 返回字节流和其他的 JSON 信息return StreamingResponse(file_like, media_type="image/jpeg",headers={"Additional-Info": json_info.model_dump_json()})if __name__ == '__main__':import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

客户端:

import requestsurl = "http://127.0.0.1:8000/get_demo_image_with_json"response = requests.get(url)# 检查请求是否成功
if response.status_code == 200:# 获取文件的字节流image_data = response.content# 处理其他的 JSON 信息additional_info = response.headers.get("Additional-Info")# 在此处添加您的处理逻辑,例如保存字节流到文件,解析 JSON 信息等# ...print("Image loaded successfully.")print(f"Additional Info: {additional_info}")else:print(f"Failed to fetch image. Status code: {response.status_code}")

POST方法 StreamingResponse

服务器代码:

import iofrom fastapi import FastAPI, File, UploadFile
from fastapi.responses import StreamingResponse
from pydantic import BaseModelapp = FastAPI()# 创建一个 Base 模型,用于表示其他的 JSON 信息
class AdditionalInfo(BaseModel):message: strstatus: str@app.post("/get_demo_image_with_json")
async def get_demo_image_with_json():#  读取face.pngimage_data = open("face.png", "rb").read()# 模拟其他的 JSON 信息json_info = AdditionalInfo(message="Image loaded successfully", status="OK")# 使用 StreamingResponse 返回字节流和其他的 JSON 信息return StreamingResponse(io.BytesIO(image_data), media_type="image/png",headers={"Additional-Info": json_info.model_dump_json()})if __name__ == '__main__':import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

客户端参数:

import requestsurl = "http://127.0.0.1:8000/get_demo_image_with_json"response = requests.post(url)# 检查请求是否成功
if response.status_code == 200:# 获取文件的字节流image_data = response.content# 写入文件with open("demo_image_with_json.png", "wb") as fp:fp.write(image_data)# 打印其他参数print(response.headers["Additional-Info"])else:print(f"Failed to fetch image. Status code: {response.status_code}")

其他

还有FileResponse、base64。
FileResponse太肤浅,base64对于大文件来说太大。

在 FastAPI 中,返回文件字节流的主要方式包括使用 StreamingResponseFileResponse。这两者都可以用于返回二进制数据,例如图像文件。

  1. StreamingResponse: 适用于以流式方式发送数据,对于大型文件特别有用,因为它允许在数据生成时就开始发送,而不必等到整个数据集都可用。

    from fastapi.responses import StreamingResponse@app.get("/get_demo_image")
    async def get_demo_image():image_data = open("face.png", "rb").read()return StreamingResponse(io.BytesIO(image_data), media_type="image/png")
    
  2. FileResponse: 适用于返回文件,可以从文件系统路径中读取文件内容,也可以通过 content 参数直接传递文件内容。

    from fastapi.responses import FileResponse@app.get("/get_demo_image")
    async def get_demo_image():image_data = open("face.png", "rb").read()return FileResponse(content=image_data, media_type="image/png")
    

这两种方法都是有效的,并且具体的选择可能取决于你的应用程序的需求和性能考虑。如果你希望以异步方式发送文件,你可能会更喜欢 StreamingResponse。如果你只是从文件系统中返回文件,FileResponse 是一个更简单的选择。

关于压缩

FastAPI本身没有直接支持响应内容压缩的中间件,但你可以通过使用 Starlette 的中间件来实现这一功能。具体来说,Starlette 提供了 `Middleware` 类,你可以使用它来定义自定义中间件。以下是一个简单的例子,演示如何使用 Gzip 中间件来压缩响应内容:```python
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from starlette.responses import FileResponse
from starlette.middleware.gzip import GZipMiddleware
from pydantic import BaseModelapp = FastAPI()# 使用 Gzip 中间件
app.add_middleware(GZipMiddleware, minimum_size=1000, compress_level=6)# 创建一个 Base 模型,用于表示其他的 JSON 信息
class AdditionalInfo(BaseModel):message: strstatus: str@app.get("/get_demo_image_with_json")
async def get_demo_image_with_json():# 从文件中读取字节流file_path = "face.png"file_like = open(file_path, mode="rb")# 模拟其他的 JSON 信息json_info = AdditionalInfo(message="Image loaded successfully", status="OK")# 使用 StreamingResponse 返回字节流和其他的 JSON 信息return StreamingResponse(file_like, media_type="image/jpeg",headers={"Additional-Info": json_info.json()})

在上述代码中,通过添加 GZipMiddleware 到 FastAPI 应用中,你启用了 Gzip 压缩。在 StreamingResponse 中返回的字节流会在传输过程中被压缩。请注意,Gzip 压缩可能会增加 CPU 使用,但通常可以显著减小传输的数据量,提高性能。你可以根据需求调整 minimum_sizecompress_level 参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/207795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pycharm debug的时候变量显示不出来,一直Collecting data...问题解决

问题描述: 如图所示:一直加载不出来变量,显示Collecting data 解决办法: 在setting中给下图中的选项打勾 这下就可以了。 应该是调试时候有线程冲突,具体我也不太懂。

springboot(ssm勤工助学管理系统 勤工俭学网站Java(codeLW)

springboot(ssmBBS勤工助学管理系统 勤工俭学网站Java(code&LW) 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0&…

mysql服务日志打印,时区不对的问题

查资料发现 原来日志的时区和服务器的时区不是一个参数控制的 log_timestamps 单独控制日志的时区 show global variables like log_timestamps;看到默认的是UTC,只需要修改为和系统一致就行 #数据库中直接修改 set global log_timestampsSYSTEM;#配置文件my.cn…

springboot086靓车汽车销售网站

springboot086靓车汽车销售网站 成品项目已经更新!同学们可以打开链接查看!需要定做的及时联系我!专业团队定做!全程包售后! 2000套项目视频链接:https://pan.baidu.com/s/1N4L3zMQ9nNm8nvEVfIR2pg?pwd…

APP测试基本流程及测试点总结

APP测试基本流程及测试点总结 1 测试流程 1.1 流程图 1.2 测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间。 1.3 测试资源 测试任务…

12.8每日一题(备战蓝桥杯分支练习)

12.8每日一题(备战蓝桥杯分支练习) 题目 1633: 【入门】判断3的倍数题目描述输入输出样例输入样例输出来源/分类 题解 1633: 【入门】判断3的倍数题目 1636: 【入门】超市卖电池题目描述输入输出样例输入样例输出来源/分类 题解 1636: 【入门】超市卖电池…

B : DS静态查找之折半查找

Description 给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始 要求使用折半查找算法 Input 第一行输入n,表示队列有n个数据 第二行输入n个数据,都是正整数,从小到大,用空格隔开 …

VQVAE

68、VQVAE预训练模型的论文原理及PyTorch代码逐行讲解_哔哩哔哩_bilibili本期视频主要讲解大规模无监督预训练模型之VQVAE的论文原理以及PyTorch代码逐行讲解,希望对大家理解VQVAE以及图像生成有帮助。, 视频播放量 9920、弹幕量 80、点赞数 485、投硬币枚数 322、收…

Linux:dockerfile编写搭建tomcat练习(9)

我使用的httpyum仓库 本地使用了5个文件,tomcat使用的官网解压直接用的包】 Dockerfile 主配置文件 基于centos基础镜像 jdk1.8.0_91 java环境 run.sh 启动脚本 centos.repo 仓库文件 tomcat 源码包 vim Dockerfile写入FROM centos MAINTAINER ta…

一个 postman实现参数化让我丢掉了一份20k的offer

什么时候会用到参数化 比如:一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块:正确的用户名,密码 成功;错误的用户名,正确的密码 失败 postman实现参数化 在实际的接口测试中,部分参数…

C++ Boost提供的六种进程间通信技术介绍

作者:令狐掌门 技术交流QQ群:675120140 博客地址:https://mingshiqiang.blog.csdn.net/ 文章目录 一、共享内存(Shared Memory)1.1 共享内存的原理创建共享内存段映射到进程地址空间进程间的数据访问同步访问生命周期管理安全性和资源限制实际应用1.2 boost共享内存代码演…

Ubuntu22.04安装和卸载软件的命令行

一、安装 sudo apt install xxx 二、卸载 sudo apt remove xxx 三、卸载依赖包(可选) 第二步软件卸载之后,有一些依赖包没有被卸载。可以使用sudo apt autoremove xxx来卸载。如果不卸载应该也没什么影响

Andorid sudio 换行方法

1.遇到的问题,二维码内容要换行 String text "成绩:1000 \n姓名:张三 \n姓名:张三 \n姓名:张三 \n姓名:张三 \n姓名:张三 \n姓名:张三 \n姓名:张三 \n姓名&#xff…

阿里云服务器2核8G/4核16G/8核32G配置选择经济型、通用算力型、通用型哪个好?

2核8G/4核16G/8核32G配置的阿里云服务器在阿里云活动中目前有经济型e、通用算力型u1、通用型c7和通用型g8y四种实例可选,虽然配置相同,但是这些实例规格之间的价格差别是很大的,以2核8G配置为例,活动价格最便宜的经济型e实例2核8G…

2023亚太五岳杯量子计算挑战赛数学建模思路代码模型论文

2023五岳杯数学建模思路:比赛开始后第一时间更新,获取见文末名片 今年,APMCM亚太地区大学生数学建模竞赛组委会正式和玻色量子、中国移动云能力中心等多家单位达成合作。 开展APMCM校企合作高校巡回学术讲座活动,为企业、高校搭…

LeetCode435. Non-overlapping Intervals

文章目录 一、题目二、题解 一、题目 Given an array of intervals intervals where intervals[i] [starti, endi], return the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping. Example 1: Input: intervals [[1,2]…

vue router之route和router的区别

1、区别 用一句话来概括这两个区别就是route是用来获取路由信息的,router是用来操作路由的。 2、route 2.1什么是route: route是一个路由对象(route object)表示当前激活的路由的状态信息,它包含了当前URL解析得到的…

mysql存json数据时的查询办法

很多时候mysql的一列当中存的是json格式的数据,这时候如果要查询某个key对应的值的时候要如何查询呢,这里记录一种查询方法: json列的值: {“InventoryMainTypeCode”: 1, “InventoryMainTypeName”: “GOOD”} 现在要查询Inve…

win10 笔记本卡顿优化

Windows SysMain 服务是 Windows 操作系统中的一个关键组件,它的作用是启用系统的 SuperFetch 功能。SuperFetch 旨在改善系统的性能,通过预加载常用的应用程序和文件到内存中,以加速它们的启动和响应时间。SysMain 服务负责管理 SuperFetch …

Python并发-线程和进程

一、线程和进程对应的问题 **1.进程:**CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可…