当前位置: 首页 > 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.gsyq.cn/news/142310.html

相关文章:

  • 论文降AIGC实战血泪史:10款工具亲测与决胜心法
  • 从零理解Open-AutoGLM 2.0,掌握大模型自动压缩与加速推理核心技术
  • 2025年比较好的抗风工业门/防爆工业门厂家推荐及选购参考榜 - 品牌宣传支持者
  • 2025年口碑好的德国精工静音阻尼轨道TOP品牌厂家排行榜 - 品牌宣传支持者
  • 2025年比较好的座搬运电动叉车/新能源电动叉车厂家最新权威推荐排行榜 - 品牌宣传支持者
  • AI 英语写作 APP 的开发
  • 梁文锋关于量化的演讲
  • AI大模型时代,文科生的新机遇:转行攻略与实战经验(建议收藏)
  • 适用于大公司的hr saas系统top10分享,附带HR选型技巧!
  • 基于人物名称聚合的人脸向量搜索优化
  • 如何用数据透视足球:建立你的理性扫盘分析体系
  • 跨平台场景下Java如何处理大文件上传的版本兼容问题?
  • RRT*算法与三次 B 样条函数在机械臂轨迹避障中的应用
  • 2025年膜结构实力厂家最新推荐榜:膜结构停车棚、膜结构看台、膜结构景观、膜结构遮阳棚含3万平厂房国企合作案例及品牌深度解析 - 呼呼拉呼
  • Go语言中的数组:深入理解其底层实现(小白也能看懂的Go语言数据结构教程)
  • 2025年氧化铝陶瓷管实力厂家推荐:氧化铝陶瓷垫板/氧化铝陶瓷片/氧化铝陶瓷柱源头厂家精选 - 品牌推荐官
  • 【大模型工程师必看】:Open-AutoGLM 2.0的5个关键技术组件详解
  • 2025年评价高的墙面铝合金线槽厂家实力及用户口碑排行榜 - 品牌宣传支持者
  • 大模型AI产品经理学习全攻略:300+视频教程+200本书籍+面试题合集,助你从零到高薪就业
  • 为什么99%的人都搞不定Open-AutoGLM手机部署?这3大坑你踩过吗?
  • 深入理解Java注解(从零开始手把手教你自定义与使用Java注解)
  • KDTree 局部地图在 FAST-LIO 中的作用
  • Open-AutoGLM上手机,只需这4步!开发者必看的轻量化部署秘籍
  • Open-AutoGLM沉思:它如何重构大模型自动化推理的未来?
  • 隔离485+网口双模:16位AD高精度采集,数据传输零干扰
  • KDTree原理介绍
  • 敦化市鼻炎调理哪家好?曹丹诊所为您提供专业中医解决方案 - 品牌日记
  • 探索大数据领域 Eureka 的服务限流机制
  • 2025年比较好的金属反弹骑马抽最新TOP品牌厂家排行 - 品牌宣传支持者
  • 2025年评价好的景区亮化工程/道路景观亮化工程品牌实力榜 - 品牌宣传支持者