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

Flutter+Dio上传图片至API:avatar字段需字符串格式的解决方案

解决方法:将图片以Base64字符串格式发送至API

你之前尝试Base64编码未生效的核心原因是:仍在使用multipart/form-data请求头和FormData包装数据,而接口要求的是JSON格式请求体,其中avatar字段为字符串类型。

具体修改步骤

  • 调整请求头:将content-type从multipart/form-data改为application/json,告知接口接收JSON格式数据。
  • 移除FormData包装:直接将构建好的data对象作为请求体发送,无需转为FormData。
  • 完善Base64格式:给Base64字符串添加MIME类型前缀(如data:image/jpeg;base64,),多数接口需要此前缀识别图片类型。

修改后的完整代码

static Future<Response> updateUserAccount({
  XFile? avatar,
  String? fullName,
  String? email,
  String? oldPhone,
  String? phone,
  String? city,
  String? streetName,
  String? landmark,
  String? oldPassword,
  String? password,
}) async {
  final dio = Dio();
  String token = await SecureStorageUtils.getToken();
  dio.options.headers['accept'] = '*/*';
  // 修改content-type为JSON格式
  dio.options.headers['content-type'] = 'application/json';
  dio.options.headers['authorization'] = 'Bearer $token';
  
  Map<String, dynamic> data = {};

  if (avatar != null) {
    // 读取图片字节并转为Base64
    List<int> fileBytes = await avatar.readAsBytes();
    String base64Avatar = base64Encode(fileBytes);
    // 获取图片MIME类型,默认用jpeg兜底
    String mimeType = avatar.mimeType ?? 'image/jpeg';
    // 拼接带前缀的Base64字符串
    data['avatar'] = 'data:$mimeType;base64,$base64Avatar';
  }

  if (email != null) {
    data['email'] = email;
  }

  if (oldPhone != null) {
    data['old_phone_number'] = oldPhone;
  }

  if (phone != null) {
    data['phone_number'] = phone;
  }

  if (city != null || streetName != null || landmark != null) {
    final address = {};
    if (city != null) address['city'] = city;
    if (streetName != null) address['street_name'] = streetName;
    if (landmark != null) address['landmark'] = landmark;
    data['address'] = address;
  }

  if (oldPassword != null) data['old_password'] = oldPassword;
  if (password != null) data['password'] = password;
  if (fullName != null) data['full_name'] = fullName;

  print("data: $data");

  // 直接发送data对象,无需FormData
  final response = await dio.patch(
    AppUrl.currentUser,
    data: data,
  );
  return response;
}

额外排查点

如果修改后仍无法生效,可从以下方向排查:

  • 核对接口文档,确认是否要求Base64字符串不带MIME前缀,若如此则去掉data:$mimeType;base64,部分。
  • 打印最终的data对象,检查avatar字段格式是否完全匹配接口要求。
  • 启用Dio的日志拦截器,查看实际发送的请求内容,确认数据是否正确传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 18:33:28