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

Android上传图片至Dev服务器触发UnicodeDecodeError问题求助

问题排查与解决方案

错误根源

报错直接来自中间件代码第144行:str(request.body, 'utf-8').replace('\n', '')。上传图片时,请求体是二进制数据(包含图片字节流,比如0xff这类非UTF-8编码的字节),强行用UTF-8解码必然触发UnicodeDecodeError。

场景差异原因

结合你描述的现象,可能的差异点包括:

  • 中间件代码不一致:Stage/Prod服务器的中间件可能已经修复了这个错误逻辑(比如跳过二进制请求体的UTF-8解码),但Dev环境的代码未同步。
  • 请求体触发条件:Android向Dev发送的请求中,表单字段或图片流的字节位置刚好包含0xff这类解码失败的字节,而其他客户端(iOS/Postman)或其他环境的请求中,该位置字节恰好是UTF-8兼容的。但这只是触发条件,根本问题还是中间件的错误解码逻辑。
  • 依赖版本差异:Dev服务器的Django或相关依赖版本与其他环境不同,导致request.body处理行为有细微差别,但概率较低,核心问题仍在中间件。

修复方案

  1. 修改中间件代码(核心解决)
    不要对所有请求体执行UTF-8解码,根据请求类型区分处理:

    if request.body:
        # 针对文件上传类二进制请求,直接记录长度避免解码
        if request.content_type.startswith('multipart/form-data') or request.content_type == 'application/octet-stream':
            body_repl = f'[binary data, length: {len(request.body)}]'
        else:
            try:
                body_repl = str(request.body, 'utf-8').replace('\n', '')
            except UnicodeDecodeError:
                # 捕获解码错误,记录二进制数据标识
                body_repl = f'[non-UTF8 binary data, length: {len(request.body)}]'
    else:
        body_repl = 'null'
    
  2. 同步环境代码与配置
    对比Stage/Prod服务器的middleware.py代码,确认Dev环境是否遗漏了针对二进制请求的处理逻辑,及时同步修复后的代码。

  3. 验证Android请求(可选)
    抓包对比Android向Dev和Stage发送的请求,检查Content-Type是否正确设置为multipart/form-data,请求体结构是否一致,排除客户端在Dev环境下的请求异常。

内容的提问来源于stack exchange,提问作者oikawatoru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:05:17