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处理行为有细微差别,但概率较低,核心问题仍在中间件。
修复方案
修改中间件代码(核心解决)
不要对所有请求体执行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'同步环境代码与配置
对比Stage/Prod服务器的middleware.py代码,确认Dev环境是否遗漏了针对二进制请求的处理逻辑,及时同步修复后的代码。验证Android请求(可选)
抓包对比Android向Dev和Stage发送的请求,检查Content-Type是否正确设置为multipart/form-data,请求体结构是否一致,排除客户端在Dev环境下的请求异常。
内容的提问来源于stack exchange,提问作者oikawatoru
相关产品推荐
相关产品推荐

