You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中实现与Web应用的二进制数据收发?(FastAPI开发相关疑问)

如何在Python中实现与Web应用的二进制数据收发?(FastAPI开发相关疑问)

嘿,我来跟你唠唠在FastAPI里怎么搞定二进制数据的收发,都是实际开发中踩过坑后总结的实用方法,应该能解决你的疑问!

接收二进制数据的常见场景

1. 接收上传的二进制文件(表单上传)

如果是客户端通过表单上传二进制文件(比如图片、压缩包),FastAPI提供了两种常用的方式:

  • 直接获取二进制字节串(适合小文件):
from fastapi import FastAPI, File

app = FastAPI()

@app.post("/upload-small-binary/")
async def upload_small_binary(file: bytes = File(...)):
    # 这里可以直接操作二进制字节串,比如写入本地文件
    with open("received_file.bin", "wb") as f:
        f.write(file)
    return {"message": "文件上传成功", "file_size": len(file)}
  • 使用UploadFile(适合大文件,支持异步操作):
    UploadFile不仅能拿到二进制内容,还能获取文件名、内容类型这些元数据,而且是流式读取,不会一下子把大文件加载到内存里:
from fastapi import FastAPI, UploadFile

app = FastAPI()

@app.post("/upload-large-binary/")
async def upload_large_binary(file: UploadFile = File(...)):
    # 异步读取文件内容
    content = await file.read()
    # 也可以分块读取,更省内存
    # content = b""
    # while chunk := await file.read(1024):
    #     content += chunk
    with open(f"received_{file.filename}", "wb") as f:
        f.write(content)
    return {"message": "大文件上传成功", "filename": file.filename, "file_size": len(content)}

2. 接收原始二进制请求体

如果客户端直接发送二进制流(不是通过表单,比如自定义协议的二进制数据),可以直接接收bytes类型的请求体,或者通过Request对象读取:

from fastapi import FastAPI, Body, Request

app = FastAPI()

# 方式1:直接声明bytes类型的请求体
@app.post("/raw-binary-body/")
async def receive_raw_binary(data: bytes = Body(...)):
    # 处理原始二进制数据,比如解析自定义协议
    return {"received_data_size": len(data)}

# 方式2:用Request对象读取请求体
@app.post("/raw-binary-request/")
async def receive_raw_binary_via_request(request: Request):
    raw_data = await request.body()
    # 这里可以对raw_data做解析,比如用struct模块解析固定格式的二进制
    return {"received_data_size": len(raw_data)}

发送二进制数据的实现方式

1. 返回本地二进制文件

如果要返回服务器上已有的二进制文件,用FileResponse最方便,它会自动处理文件读取和响应头(比如Content-Disposition让客户端触发下载):

from fastapi import FastAPI
from fastapi.responses import FileResponse

app = FastAPI()

@app.get("/download-local-file/")
async def download_local_file():
    # 指定文件路径、媒体类型和下载后的文件名
    return FileResponse(
        path="path/to/your/local/file.bin",
        media_type="application/octet-stream",
        filename="client-downloaded.bin"
    )

2. 直接返回二进制字节串

如果是动态生成的二进制数据(比如生成的图片、加密后的内容),可以用Response对象直接返回bytes,记得指定正确的media_type让客户端正确解析:

from fastapi import FastAPI
from fastapi.responses import Response

app = FastAPI()

@app.get("/dynamic-binary/")
async def send_dynamic_binary():
    # 模拟动态生成二进制数据,比如生成一个简单的二进制内容
    dynamic_binary = b"这是动态生成的二进制数据,你可以替换成自己的业务逻辑生成的内容"
    # 如果是图片,media_type改成"image/png";如果是音频,改成对应的类型
    return Response(content=dynamic_binary, media_type="application/octet-stream")

实战小提示

  • 处理大文件时,优先用UploadFile和分块读取,避免内存溢出;
  • 返回二进制数据时,一定要设置正确的media_type,比如图片用image/jpeg、image/png,通用二进制流用application/octet-stream,不然客户端可能无法正确识别内容;
  • 如果要解析自定义格式的二进制数据,可以用Python的struct模块,它能帮你把二进制字节串解析成对应的数值、字符串等类型。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 12:34:39