news 2026/6/10 0:44:45

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
记一次 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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 10:45:59

计算机Java毕设实战-基于springboot的就业推荐系统基于springboot的高校毕业生就业信息管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/10 15:37:59

Java毕设选题推荐:基于Java的诊所管理系统设计与实现基于java的私人牙科诊所管理系统设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/6/10 19:46:52

Springboot新能源科普网站i5ghr本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

统程序文件列表项目功能:用户,书籍分类,科普书籍,科普文章开题报告内容一、研究背景与意义1.1 研究背景随着全球能源危机的加剧与碳中和目标的推进,新能源技术(如太阳能、风能、氢能)已成为各国战略重点。然而,新能源技…

作者头像 李华
网站建设 2026/6/10 13:56:46

Docker在测试环境中的应用:效率、一致性与敏捷性的变革

在软件交付周期日益缩短、技术栈日趋复杂的今天,测试环境的稳定性、一致性与快速部署能力,已成为决定测试效能与发布质量的关键瓶颈。传统的物理机或虚拟机环境,常因配置差异、资源争用和启动缓慢等问题,导致“在我机器上是好的”…

作者头像 李华
网站建设 2026/6/10 14:47:25

Kubernetes上的测试:挑战与解决方案

测试范式的转变 Kubernetes已成为云原生应用事实上的部署与运行标准。其带来的自动扩缩容、滚动更新、声明式配置等特性,在提升运维效率和资源利用率的同时,也彻底改变了应用的运行态。对于测试团队而言,这意味着测试对象从一个相对静态的“…

作者头像 李华