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.pswp.cn/news/207795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/207795.shtml
英文地址,請注明出處:http://en.pswp.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在很短的時間就可…