Flutter使用Dio上传图片遭遇Socket Exception问题求助
解决Dio上传FormData时的Connection reset by peer错误
我来帮你排查这个问题,SocketException: OS Error: Connection reset by peer, errno = 54通常意味着客户端和服务器的连接在数据传输过程中被意外中断了。结合你的Dio图片上传场景,我整理了几个常见的排查方向和解决办法:
1. 校验文件与请求参数的有效性
- 先确认
UploadFileInfo传入的image对象是否有效:比如文件是否存在、应用有没有读取该文件的权限。可以先打印文件的大小、路径等信息,排除文件本身的问题。 - 核对服务器的接口要求:比如是否限制了文件格式(你的文件名是
profile_image.jpg,但实际文件是否为合法的JPG格式?)、文件大小上限。如果文件不符合要求,服务器可能会直接中断连接。
2. 调整Dio的请求配置
上传大文件时,默认的超时设置可能不足以完成传输,或者请求头的兼容性问题会导致连接中断:
- 延长超时时间:
_dio.options.connectTimeout = 30000; // 设置为30秒 _dio.options.receiveTimeout = 30000; - 手动指定
multipart/form-data请求头(虽然Dio会自动处理,但部分服务器需要显式声明):var response = await _dio.post( ApiConfiguration.getUploadImageUrl().toString(), data: formData, options: Options( headers: { "Content-Type": "multipart/form-data", }, ), );
3. 排查网络与服务器状态
- 切换网络环境试试:比如从WiFi切换到手机流量,排除局域网防火墙、代理服务器对文件上传连接的拦截。
- 验证服务器可用性:用浏览器或Postman直接调用
3.122.199.93的上传接口,如果同样失败,说明可能是服务器临时维护、过载,或者你的IP被服务器防火墙拦截了;如果Postman能成功,再回到代码找问题。
4. 开启日志调试请求细节
开启Dio的日志拦截器,查看完整的请求、响应细节,能帮你快速定位参数或格式问题:
// 添加日志拦截器到Dio实例 _dio.interceptors.add(LogInterceptor(requestBody: true, responseBody: true));
通过日志可以确认FormData的结构、请求头是否完全符合服务器的接口规范。
内容的提问来源于stack exchange,提问作者rijaaz rasheed




