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

Flutter Retrofit多表单上传至Laravel服务器失败问题求助

解决Flutter Retrofit上传Multipart数据到Laravel的问题

嘿,我看了你的代码,问题主要出在Multipart请求的配置和接口定义上,咱们一步步来修复:

1. 修正API接口定义

首先,Multipart请求必须添加@Multipart注解,而且不能同时混用@Body和@Part——前者是用来发送JSON/普通表单数据的,后者是Multipart请求的专属参数。我们可以用@PartMap批量传递普通字段,用@Part单独传递图片文件:

@Multipart
@POST('register')
Future<RegisterResponse> register(
  @PartMap() Map<String, dynamic> fields,
  @Part() File pic,
);

如果想要更清晰地定义每个字段,也可以逐个用@Part声明:

@Multipart
@POST('register')
Future<RegisterResponse> register(
  @Part() String name,
  @Part() String username,
  @Part() String phone,
  @Part() String country_code,
  @Part() String email,
  @Part() String birth_date,
  @Part() File pic,
  @Part() double lat,
  @Part() double lon,
  @Part() String address,
  @Part() String city,
  @Part() String residential,
  @Part() String device_token,
  @Part() String code,
  @Part() List<int> tags,
);

2. 调整请求参数构造

去掉原来参数Map里的pic字段,因为图片要单独作为@Part参数传递,重复传递会导致服务器解析混乱:

// 普通字段集合,不要包含pic
Map<String, dynamic> fields = {
  "name": widget.fullName,
  "username": widget.userName,
  "phone": "698281556",
  "country_code": "+213",
  "email": "${widget.email}@gmail.com",
  "birth_date": "18-09-2021",
  "lat": 36.347285,
  "lon": 6.603381,
  "address": widget.userName,
  "city": widget.userName,
  "residential": widget.userName,
  "device_token": widget.userName,
  "code": "123456",
  "tags": [1,2]
};

3. 修正Dio实例配置

绝对不要手动设置Content-Type: multipart/form-data!Retrofit的@Multipart注解会自动让Dio生成包含正确boundary的请求头,手动设置会覆盖掉这个关键的boundary,导致Laravel服务器无法解析请求:

final logger = Logger();
final dio = Dio();
// 只保留必要的请求头即可
dio.options.headers["X-Requested-With"] = "XMLHttpRequest";
// 可选:添加日志拦截器,方便排查请求细节
dio.interceptors.add(LogInterceptor(requestBody: true, responseBody: true));
final client = RestClient(dio);

4. 正确调用接口

现在用修正后的参数调用接口即可:

client.register(fields, imageFile!).then((it) async {
  print(it.access_token);
}).catchError((Object obj) {
  switch (obj.runtimeType) {
    case DioError:
      final res = (obj as DioError).response;
      logger.e("Got error : ${res!.statusCode} -> ${res.data}");
      break;
    default:
      logger.e("Unexpected error: $obj");
  }
});

额外注意事项

  • 如果Laravel后端对tags数组的解析有问题,可以尝试把列表转成逗号分隔的字符串(比如"1,2")再传递,或者检查后端的请求验证规则。
  • 调用前确认imageFile是有效的File对象,可以打印imageFile.path验证文件存在。

这样调整后,你的Multipart请求应该就能正常被Laravel服务器接收了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:48:14