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
相关产品推荐
相关产品推荐

