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

Flutter上传大视频出现SocketException: OS Error: Broken pipe错误如何解决?

错误原因

SocketException: OS Error: Broken pipe, errno = 32 本质是大文件上传过程中,服务端主动提前关闭了TCP连接,客户端还在继续向已关闭的连接写入数据就会抛出该错误,结合你的场景具体原因如下:

  • 客户端代码存在明显逻辑错误:你连续两次调用了request.send()方法,MultipartRequest的send方法只能调用一次,第一次调用时就已经开始消费文件上传流,第二次重复调用会导致流数据异常、连接状态紊乱,大文件上传时该问题会被放大,直接触发连接断开。小文件因为上传速度快,第一次调用很快完成,第二次调用的异常未被触发,所以能上传成功。
  • Express服务端未配置足够大的上传文件限制:multer、express.json等内置/第三方中间件默认都有上传大小限制(通常为10MB以内),大体积视频超出限制时服务端会直接终止请求、关闭连接。
  • 服务端/反向代理超时时间过短:大文件上传耗时更长,如果服务端、Nginx等反向代理的超时时间配置过短,上传未完成就会被主动断开连接。

Postman上传全部成功是因为Postman不会重复发送请求,且默认做了超时、流传输的兼容处理,所以不会触发该问题。

解决方案

客户端修复(优先级最高)

  1. 删除重复的send调用,移除以下代码:
request.send().then((value) => print("jawk behy $value"),
    onError: (error) => print("error : $error"));

仅保留var response = await request.send();这一处请求发送逻辑即可。
2. 优先使用官方封装好的MultipartFile.fromPath构造方法,无需自行处理ByteStream,避免流操作出错:

request.files.add(await http.MultipartFile.fromPath("video", file.absolute.path));
  1. 给请求增加更长的超时配置,适配大文件上传的时长需求:
request.send().timeout(const Duration(minutes: 10));

服务端配置调整

  1. 调整上传中间件的文件大小限制,以常用的multer为例:
const multer = require('multer');
// 按需调整最大文件大小,示例为500MB
const upload = multer({ limits: { fileSize: 1024 * 1024 * 500 } });
  1. 调整express内置中间件的大小限制:
app.use(express.json({ limit: '500mb' }));
app.use(express.urlencoded({ extended: true, limit: '500mb' }));
  1. 如果服务端前有Nginx反向代理,修改Nginx配置调大限制和超时:
client_max_body_size 500M;
proxy_read_timeout 600s;
proxy_send_timeout 600s;

调整完成后重启Nginx和Express服务即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 00:36:09