如何在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
相关产品推荐
相关产品推荐

