当前位置: 首页 > news >正文

记一次 FTP 下载报错:ClientAbortException 与 断开的管道(Broken pipe )

1. 问题现象

在开发基于 Java 的 FTP 文件下载功能时,通过curl调用下载接口,程序抛出异常,且 FTP 服务端返回错误指令。

后端异常日志:

PASV 227 Entering Passive Mode (10,151,161,108,33,51) RETR /1.jpg 150 Opening BINARY mode data connection for /1.jpg (385621 bytes). QUIT 426 Failure writing network stream. Caused by: org.apache.commons.net.io.CopyStreamException: IOException caught while copying. at org.apache.commons.net.io.Util.copyStream(Util.java:280) ~[commons-net-3.9.0.jar!/:3.9.0] at org.apache.commons.net.ftp.FTPClient._retrieveFile(FTPClient.java:893) ~[commons-net-3.9.0.jar!/:3.9.0] at org.apache.commons.net.ftp.FTPClient.retrieveFile(FTPClient.java:2819) ~[commons-net-3.9.0.jar!/:3.9.0] at com.example.demo.YxSftpUtils.downloadFtp(YxSftpUtils.java:85) ~[classes!/:0.0.1-SNAPSHOT] ... 52 common frames omitted Suppressed: org.apache.catalina.connector.ClientAbortException: java.io.IOException: 断开的管道 at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:351) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41] at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:776) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41] at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:298) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41] at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:251) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41] at org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:157) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41] at com.example.demo.YxSftpUtils.downloadFtp(YxSftpUtils.java:93) ~[classes!/:0.0.1-SNAPSHOT] ... 52 common frames omitted Caused by: java.io.IOException: 断开的管道 at sun.nio.ch.FileDispatcherImpl.write0(Native Method) at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) at sun.nio.ch.IOUtil.write(IOUtil.java:65) at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:469) at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:138) at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:152) at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1253) at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:764) at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:584) at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:528) at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:546) at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:110) at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:193) at org.apache.coyote.Response.doWrite(Response.java:601) at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:339) ... 57 common frames omitted

2. 原因分析(核心根源)

通过对curl -v详细日志的分析,发现该问题的根源不在于后端 Java 代码(直接使用的FTPClient.retrieveFile),而在于客户端(curl)的默认行为

链路推导:

  1. curl 安全保护机制:当使用curl请求二进制文件(如.jpg.zip)且未指定输出文件时,curl会默认尝试将二进制内容输出到终端屏幕。

  2. 连接主动中断:为了防止二进制乱码破坏终端显示,curl在检测到大量不可读字符时会主动中断 HTTP 连接

  3. Broken pipe 产生:Java 后端正通过OutputStream持续写入数据,由于前端curl已经关闭了 Socket 管道,后端写入失败,抛出ClientAbortException

  4. FTP 异常收尾:Java 代码触发finally块中的ftpClient.disconnect(),向 FTP 服务器发送QUIT命令。

  5. FTP 426 报错:由于数据传输中途被QUIT强行终止,FTP 服务器记录下426 Failure writing network stream(写入网络流失败)。


3. 解决方案

在执行curl命令时,加上--output参数,将数据流导向文件而非屏幕。

# 正确的调用方式 curl -v --location "http://ip:port/ftpTest" --output test_result.jpg
http://www.jsqmd.com/news/129691/

相关文章:

  • 2025年靠谱的热压机用户好评厂家排行 - 品牌宣传支持者
  • 论文降AIGC实战血泪史:10款工具亲测与决胜心法
  • 玻璃钢电缆沟盖板厂家有哪些?2025玻璃钢盖板厂家+高承载玻璃钢格栅厂家推荐汇总 - 栗子测评
  • 拯救者 Legion Go 硬盘更换全攻略:扩容不踩坑,新手也能看懂的拆机指南
  • 2025年12月田径教练证书,运动康复证书,足球教练证书学校推荐:行业测评与选择指南 - 品牌鉴赏师
  • 从零理解Open-AutoGLM 2.0,掌握大模型自动压缩与加速推理核心技术
  • 2025年湘潭莲子制造企业权威推荐榜单:正宗手工莲芯/湘潭磨皮莲子/湘莲基地源头厂家精选 - 品牌推荐官
  • 2025年比较好的抗风工业门/防爆工业门厂家推荐及选购参考榜 - 品牌宣传支持者
  • 【独家首发】Open-AutoGLM开源项目全剖析:国内首个GLM自动调优框架(含GitHub地址)
  • 2025年卷板机设备厂家实力推荐:三辊卷圆机/板材自动卷板机/液压卷板机源头厂家精选 - 品牌推荐官
  • 西南多行业品牌服务优选指南
  • 2025年口碑好的德国精工静音阻尼轨道TOP品牌厂家排行榜 - 品牌宣传支持者
  • 互联网医院13用户体系基石——账号注册与登录态的“无感恢复”
  • 2025年知名的绵阳电梯生产/广安电梯改造客户信赖口碑排行榜 - 品牌宣传支持者
  • 2025年比较好的座搬运电动叉车/新能源电动叉车厂家最新权威推荐排行榜 - 品牌宣传支持者
  • AI 英语写作 APP 的开发
  • 2025年靠谱的不锈钢洗漱台/不锈钢浴室柜厂家最新权威实力榜 - 品牌宣传支持者
  • 2025年知名的高端家纺消费者满意度榜单 - 品牌宣传支持者
  • 如何结合国产信创动环监控系统提升设备运维效率?
  • 《lvgl基础学习 —— 消息机制》
  • 网络》》Combo口(光电复用口)
  • 适用于大公司的hr saas系统top10分享,附带HR选型技巧!
  • AI大模型时代,文科生的新机遇:转行攻略与实战经验(建议收藏)
  • 基于人物名称聚合的人脸向量搜索优化
  • 2025年靠谱的开口自粘铝箔橡塑管/橡塑隔音材料厂家最新实力排行 - 品牌宣传支持者
  • 2025年比较好的FVDH-280度防火阀/不锈钢防火阀行业内口碑厂家排行榜 - 品牌宣传支持者
  • Open-AutoGLM Windows部署实战全流程(专家级避坑手册)
  • Open-AutoGLM开源了!手把手教你从零构建自动化大语言模型,速领地址
  • 2025年氧化铝陶瓷管实力厂家推荐:氧化铝陶瓷垫板/氧化铝陶瓷片/氧化铝陶瓷柱源头厂家精选 - 品牌推荐官
  • 2025年知名的切铝圆锯机厂家最新用户好评榜 - 品牌宣传支持者