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

