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

使用Flutter(DIO)上传图片至API时遇406错误的求助

解决Flutter Dio上传图片返回406 NOT ACCEPTABLE的问题

以下是几个排查和解决方向:

1. 移除手动设置的Content-Type头

Dio在处理FormData时会自动生成带boundary分隔符的multipart/form-data请求头,手动设置固定的"Content-Type": "multipart/form-data"会覆盖自动生成的正确头,导致服务器无法解析表单数据。修改请求代码:

static PostFormData({String? url, FormData? body}) async {
  print("Start PostForm Data");
  var response = await Dio().post(url!,
      data: body!,
      options: Options(headers: {
        // 移除手动设置的Content-Type
        'Accept': '*/*',
      }));
  print("End PostFormData");
  return response.data;
}

2. 对齐字段数据类型与Postman请求

逐个对比Postman中发送的字段:

  • 确认tenant_rent这类数值字段,event.rentPrice是数字类型而非字符串;
  • 检查tenant_birthdate、date的日期格式,要和Postman发送的完全一致(比如YYYY-MM-DD或带时间戳格式);
  • 核对所有字段名的拼写、大小写,必须和API要求的完全匹配(比如避免Tenant_Id和tenant_id的差异)。

3. 为MultipartFile指定MIME类型

Postman会自动识别图片的MIME类型(如image/jpeg、image/png),Flutter中需要手动指定,避免服务器无法识别文件类型:

"tenant_image": await MultipartFile.fromFile(
  event.image.path,
  filename: event.image.name,
  contentType: MediaType('image', event.image.name.split('.').last.toLowerCase()),
),

如果不确定图片格式,也可以直接用MediaType('image', '*')兼容所有图片类型。

4. 补充Postman中的缺失请求头

检查Postman的请求头,比如是否携带了Authorization令牌、自定义业务头,把这些缺失的内容补充到Dio的headers中:

options: Options(headers: {
  'Accept': '*/*',
  'Authorization': 'Bearer ${yourAuthToken}', // 根据实际情况添加
  // 其他必要的请求头
})

5. 打印请求日志对比Postman

给Dio添加日志拦截器,打印完整的请求头、请求体,和Postman的请求逐一对比,定位差异点:

Dio dio = Dio();
dio.interceptors.add(LogInterceptor(requestBody: true, requestHeader: true));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:04:56