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

Flutter中使用Dio发送带JSON与图片的请求报500错误求助

在Flutter中用Dio发送与Postman一致的FormData请求问题

该请求在Postman中可正常运行(请求包含嵌套的mobileRequest参数以及多个files文件),但我用Dio尝试以下两种方式时,均返回500内部服务器错误:

方式一

formData = FormData.fromMap({
  "mobileRequest": {
    "companyRequest": {
      "companyId": 1,
      "serviceName": "service1",
      "serviceDescription": "service1",
      "serviceContactInfo": "+201001656577,+20100987654",
      "serviceCategoryId": 1
    }
  },
});
for (var file in filePathes) {
  formData.files.addAll([
    MapEntry(
      "files",
      await MultipartFile.fromFile(
        file,
        filename: file.split('/').last,
      ),
    ),
  ]);
}

方式二

List<MultipartFile> filesList2 = serviceEntiti.images!
    .map((e) => MultipartFile.fromFileSync(e.path))
    .toList();
formData = FormData.fromMap({
    "mobileRequest": {
      "companyRequest": {
        "companyId": 1,
        "serviceName": "service1",
        "serviceDescription": "service1",
        "serviceContactInfo": "+201001656577,+20100987654",
        "serviceCategoryId": 1
      }
    },
    "files": filesList2,
});

解决方法

问题出在Dio对嵌套Map的处理逻辑上:Dio会自动将FormData中的嵌套Map展开为mobileRequest[companyRequest][companyId]这类分散的表单字段,但后端大概率期望mobileRequest是一个完整的JSON字符串。正确的做法是先将嵌套对象序列化为JSON字符串,再放入FormData中:

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

// 1. 将嵌套的请求参数转为JSON字符串
String mobileRequestJson = jsonEncode({
  "companyRequest": {
    "companyId": 1,
    "serviceName": "service1",
    "serviceDescription": "service1",
    "serviceContactInfo": "+201001656577,+20100987654",
    "serviceCategoryId": 1
  }
});

// 2. 构建FormData
FormData formData = FormData.fromMap({
  "mobileRequest": mobileRequestJson,
});

// 3. 添加文件(如果需要指定文件MIME类型,可添加contentType参数)
for (var file in filePathes) {
  formData.files.add(MapEntry(
    "files",
    await MultipartFile.fromFile(
      file,
      filename: file.split('/').last,
      contentType: MediaType('image', 'jpeg'), // 根据实际文件类型调整,比如png、pdf等
    ),
  ));
}

// 4. 发送POST请求
Response response = await Dio().post(
  "你的接口地址",
  data: formData,
);

另外,也可以检查文件的读取方式:如果使用fromFileSync要确保文件路径正确,避免因文件读取失败导致请求异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:16:11