DRF中multipart/form-data嵌套序列化器传文件报错:提交数据非文件
问题排查与解决方法
错误原因
CONTENT_TYPE修改导致文件解析异常
自定义MultiPartJSONParser中,你将原请求里带boundary参数的完整CONTENT_TYPE(如multipart/form-data; boundary=----WebKitFormBoundaryxxx)替换成了单纯的multipart/form-data。而DjangoMultiPartParser必须依赖boundary才能区分普通表单字段和文件字段,缺失该参数后,文件会被误解析到data字典中,而非files集合里。错误数据流入序列化器
文件被误放到data后,代码尝试用json.loads解析失败(文件内容不是合法JSON),最终保留的原始内容不符合FileField对InMemoryUploadedFile对象的要求,触发The submitted data was not a file错误。
解决方法
修复自定义Parser的CONTENT_TYPE处理
移除修改CONTENT_TYPE的代码,保留原请求中带boundary的完整类型,让DjangoMultiPartParser能正确解析文件:
class MultiPartJSONParser(BaseParser): media_type = 'multipart/form-data' def parse(self, stream, media_type=None, parser_context=None): parser_context = parser_context or {} request = parser_context['request'] encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET) meta = request.META.copy() # 移除这行错误代码:meta['CONTENT_TYPE'] = media_type upload_handlers = request.upload_handlers try: parser = DjangoMultiPartParser(meta, stream, upload_handlers, encoding) data, files = parser.parse() data = data.dict() for key in data: if data[key]: try: data[key] = json.loads(data[key]) except ValueError as e: pass return DataAndFiles(data, files) except MultiPartParserError as exc: raise ParseError('Multipart form parse error - %s' % exc)
额外检查点
- 确认请求的
Content-Type头部包含合法的boundary参数(客户端/浏览器通常会自动生成) - 确保表单中的文件字段名与序列化器的
image字段完全一致 - 验证视图的
parser_classes仅配置了MultiPartJSONParser,无其他冲突的解析器
内容的提问来源于stack exchange,提问作者afinkado
相关产品推荐
相关产品推荐

