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

添加FileField时出现'InMemoryUploadedFile无法JSON序列化'错误原因

问题原因与解决方案

错误根源

报错 Object of type InMemoryUploadedFile is not JSON serializable 的核心原因:

  • 在 InsertAndInfo 视图中,你将从 request.FILES 获取的**文件对象(InMemoryUploadedFile类型)**直接放入字典,通过 requests.post 的 json 参数发送请求。但JSON仅支持基础数据类型,无法序列化二进制文件对象,因此触发类型错误。
  • 你手动设置了 Content-Type: application/json 头,强制用JSON格式传输,但文件上传必须使用 multipart/form-data 格式,这是文件传输的标准协议。

修复步骤

修改 InsertAndInfo 视图的POST请求逻辑,改用multipart/form-data格式传输文件:

修改后的views.py代码

def InsertAndInfo(request):
    if request.method == 'POST':
        name = request.POST.get('name')
        email = request.POST.get('email')
        phone = request.POST.get('phone')
        file = request.FILES.get('filedf')  # 使用get避免未上传文件时抛出KeyError

        # 分离普通字段与文件字段
        form_data = {
            'name': name,
            'email': email,
            'phone': phone
        }
        # 仅当存在文件时构造files字典
        files = {'file': file} if file else {}

        # 发送请求:用data传递普通字段,files传递文件,无需手动设置Content-Type
        requests.post(
            'http://127.0.0.1:8000/api/employees/',
            data=form_data,
            files=files
        )
        return redirect("/api/")

    # 以下代码保持不变
    employeeInfoApiLink = requests.get('http://127.0.0.1:8000/api/AllElmployeeInfo/').json()
    context = {
        "employeeInfo": employeeInfoApiLink
    }
    return render(request, 'InsertAndInfo.html', context)

额外注意事项

  1. API视图兼容性:你的 employeeListView 视图无需额外修改,Django REST Framework会自动解析 multipart/form-data 请求中的文件数据,request.data 能正确获取文件对象,Serializer可正常处理并保存到数据库。
  2. 文件存储权限:确保Django项目对 upload_to 指定的 file/ 目录有写入权限,否则文件保存时会抛出权限错误。
  3. 前端表单配置:你的 form.html 已正确设置 enctype="multipart/form-data",这是文件上传的必要配置,无需修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:30:52