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

