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

Flutter如何上传图片文件?jsonEncode处理MultipartFile时报错如何解决

报错原因
  • 类型不支持JSON序列化:MultipartFile是用于二进制文件上传的专用类,不属于JSON规范支持的基础数据类型(字符串、数字、布尔值、数组、Map、null),jsonEncode无法直接将这类自定义对象转换为JSON字符串。
  • 语法错误生成了Set结构:你写的{ MultipartFile.fromFile(filepath, filename: ' fileName') }在Dart中属于Set集合的声明逻辑(没有指定键值对结构),所以实际传入jsonEncode的是长度为1的LinkedHashSet对象,而非你预想的Map结构,JSON序列化本身也不支持直接转换Set类型,这就是报错信息中提到LinkedHashSet的直接原因。
修复方案

文件上传不能使用普通JSON格式传输二进制数据,需要改用HTTP协议标准的multipart/form-data格式提交请求,以下是两种常用实现方式:

基于dio库实现(Flutter最常用的网络请求库)

import 'package:dio/dio.dart';

// 构造FormData对象,无需jsonEncode处理
final formData = FormData.fromMap({
  // 此处upload_file为后端约定的文件接收字段名,按实际业务修改
  'upload_file': await MultipartFile.fromFile(filepath, filename: 'fileName'),
  // 其他普通业务参数直接追加即可
  'user_id': '123',
  'type': 'avatar'
});

// 直接传入formData发起post请求
final res = await Dio().post('你的上传接口地址', data: formData);

基于系统自带http库实现

import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart';

// 构造Multipart请求
final request = http.MultipartRequest('POST', Uri.parse('你的上传接口地址'));
// 添加文件参数
request.files.add(await http.MultipartFile.fromPath(
  'upload_file',
  filepath,
  filename: 'fileName',
  // 按实际文件类型修改,图片一般为image/jpeg、image/png等
  contentType: MediaType('image', 'jpeg'),
));
// 添加其他普通参数
request.fields['user_id'] = '123';
request.fields['type'] = 'avatar';

// 发送请求获取响应
final res = await request.send();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:18:01