Flutter使用Dio发送multipart类型请求上传文件报错如何解决?
Dio multipart/form-data 上传文件错误修复方案
错误1:SocketException Connection refused(错误码61)处理
该错误为网络连通性问题,和请求头配置无关,按以下顺序排查:
- 确认请求url填写正确:如果是本地调试服务端,安卓模拟器不能使用
127.0.0.1访问电脑本地服务,需替换为模拟器专属映射地址10.0.2.2;iOS模拟器/真机请使用电脑在局域网内的真实IP - 确认服务端已正常启动,对应端口没有被系统防火墙/安全软件拦截
- 确认运行应用的设备/模拟器和服务端处于同一局域网,网络可以正常互通
错误2:Http 400 状态码错误处理
400错误为请求格式不符合服务端要求,你遇到的问题大概率是手动配置content-type导致的:
Dio在发送FormData类型数据时,会自动生成带boundary分段边界参数的multipart/form-data请求头,手动写死content-type会丢失boundary参数,导致服务端无法解析上传的分段数据。按以下步骤修正:
- 删除Options中手动配置的
contentType: "multipart/form-data"参数,同时删除全局配置中的_defaultContentType = "multipart/form-data"配置,由Dio自动处理请求头即可 - 确认
FormData中的上传字段名和服务端要求的完全一致:你当前使用的字段名为file,需和后端约定的上传参数名完全匹配(大小写敏感) - 确认
getToken()方法返回的token有效,没有为空、过期或者格式错误的问题 - 确认上传的本地文件路径有效,文件没有被损坏或删除
修正后的代码示例
Dio dio = Dio(); String fileName = event.file!.path.split('/').last; FormData formData = FormData.fromMap({ "file": await MultipartFile.fromFile(event.file!.path, filename: fileName), }); try { var response = await dio.post( "替换为你的实际请求url", data: formData, options: Options( headers: { "token": await getToken(), } ), ); // 处理请求成功逻辑 } catch (e){ print(e); }
内容的提问来源于stack exchange,提问作者김민진
相关产品推荐
相关产品推荐

