You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动