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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:32:12