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

DRF中multipart/form-data嵌套序列化器传文件报错:提交数据非文件

问题排查与解决方法

错误原因

  1. CONTENT_TYPE修改导致文件解析异常
    自定义MultiPartJSONParser中,你将原请求里带boundary参数的完整CONTENT_TYPE(如multipart/form-data; boundary=----WebKitFormBoundaryxxx)替换成了单纯的multipart/form-data。而DjangoMultiPartParser必须依赖boundary才能区分普通表单字段和文件字段,缺失该参数后,文件会被误解析到data字典中,而非files集合里。

  2. 错误数据流入序列化器
    文件被误放到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:30:46