FastAPI接收Base64编码图片生成损坏文件问题排查
问题原因与解决方案
核心问题:URL编码转义导致Base64字符串失真
当你把Base64编码后的图片字符串放在URL的Query参数里时,浏览器或HTTP客户端会自动对Base64中的特殊字符(比如+、/、=)进行URL编码——比如+会被转成%2B,/转成%2F,=转成%3D。你的API直接用base64.b64decode(file1)解码的是已经被URL转义后的字符串,自然会导致解码出的二进制数据错误,生成损坏的图片文件。
另外,GET请求的URL长度有浏览器或服务器的限制(通常几KB到几十KB不等),如果图片较大,Base64编码后的字符串会非常长,直接放在Query参数里可能会被截断,这也是导致文件损坏的潜在原因。
修复方案
方案1:对Query参数先做URL解码再进行Base64解码
修改API代码,先使用urllib.parse.unquote对传入的file1参数进行URL解码,再做Base64解码:
import base64 from urllib.parse import unquote from fastapi import FastAPI app = FastAPI() @app.get("/prediction_api") def make_prediction(file1: str): # 先进行URL解码,还原被转义的Base64特殊字符 decoded_url = unquote(file1) # 再解码Base64 decoded_data = base64.b64decode(decoded_url) filename = 'image.jpg' with open('Images\\' + filename, 'wb') as image_result: image_result.write(decoded_data) # 这里添加你的预测逻辑,返回0或1 return 0
方案2:改用POST请求传递Base64数据(更推荐)
GET请求不适合传递大体积的Base64数据,改用POST请求将Base64字符串放在请求体中,避免URL编码和长度限制的问题:
from pydantic import BaseModel import base64 from fastapi import FastAPI app = FastAPI() # 定义请求体模型 class ImageRequest(BaseModel): file1: str @app.post("/prediction_api") def make_prediction(request: ImageRequest): # 直接解码Base64即可,无需处理URL转义 decoded_data = base64.b64decode(request.file1) filename = 'image.jpg' with open('Images\\' + filename, 'wb') as image_result: image_result.write(decoded_data) # 添加预测逻辑,返回0或1 return 1
发送请求时,将Base64字符串放在JSON请求体中,示例格式:
{ "file1": "你的Base64编码字符串" }
额外注意事项
- 处理文件时尽量使用
with语句,它会自动关闭文件句柄,避免资源泄漏。 - 如果图片格式不固定为JPG,建议在请求中额外传递图片格式信息,对应保存为正确格式的文件。
内容的提问来源于stack exchange,提问作者Harun Harman
相关产品推荐
相关产品推荐

