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

SpringBoot+Flutter Dio上传文件与User对象报错解决方案

问题解决步骤

1. 修正SpringBoot的User类

Spring的JSON反序列化需要类具备无参构造方法以及属性的getter/setter,否则无法正常实例化和赋值。修改后的User类如下:

public class User {

    private int id;
    private String name;

    // 必须添加无参构造
    public User() {}

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    // 添加getter和setter
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

2. 修正Flutter Dio的上传代码

核心是将User的JSON字符串包装为MultipartFile,并显式指定Content-Type为application/json,让SpringBoot能识别并反序列化为User对象:

import 'dart:convert';
import 'package:dio/dio.dart';

uploadFile() async {
    // 构造User的JSON字符串
    Map<String, dynamic> userMap = {'id': 123, 'name': 'abc'};
    String userJson = jsonEncode(userMap);

    var formData = FormData.fromMap({
      'file': await MultipartFile.fromFile(
        filePath,
        filename: 'dog.png',
      ),
      'user': MultipartFile.fromString(
        userJson,
        filename: 'user.json', // 文件名仅作标识,不影响Spring解析
        contentType: MediaType.parse('application/json'), // 关键:指定正确的Content-Type
      ),
    });

    try {
      var response = await dio.post('$baseUrl/user', data: formData);
      log.i(response);
    } catch (e) {
      log.e(e);
    }
}

为什么之前的方法失败?

  • 直接传Map:Dio会将user拆分为多个表单字段(如user[id]、user[name]),而非一个独立的JSON类型Part,导致Spring找不到名为user的请求部分。
  • 仅jsonEncode字符串:Dio默认给该Part的Content-Type是application/octet-stream,Spring无法用JSON转换器处理此类型。
  • 用本地JSON文件上传:未指定Content-Type,默认也是application/octet-stream,同样不被Spring的JSON反序列化支持。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:46:24