news 2026/4/15 5:14:06

记一次 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/4/14 16:44:02

Java计算机毕设之基于Java+SpringBoot+协同过滤算法的私人诊所管理系统设计与实现基于Java的诊所管理系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)

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

作者头像 李华
网站建设 2026/4/12 2:01:30

【Rust】变量系统详解

Rust 的变量系统是其内存安全和零成本抽象的核心组成部分。下面详细介绍 Rust 变量的关键特性: 1. 变量绑定 (Variable Binding) 在 Rust 中,变量声明被称为"绑定"(binding),强调变量与值的关联关系&#…

作者头像 李华
网站建设 2026/4/14 20:23:57

错过等一年!Open-AutoGLM正式开源,AI开发者必备的5个使用技巧

第一章:Open-AutoGLM 开源 地址 Open-AutoGLM 是一个面向自动化自然语言处理任务的开源框架,旨在简化大语言模型在实际业务场景中的集成与调优流程。该项目由社区驱动开发,代码托管于主流开源平台,便于开发者协作贡献与持续集成。…

作者头像 李华
网站建设 2026/4/12 12:24:51

【AndrejKarpathy】2025年AI大模型深度复盘:年度最深刻的行业分析!

AndrejKarpathy前几天发了一篇2025年LLM年度回顾。他是OpenAI联合创始人、前特斯拉AI总监,也是全球最有影响力的AI研究者之一。这篇文章里有6个观点,每一个都理解得非常深刻。强烈推荐大家看看。 第一: 训练方法彻底变了 2025年之前,训练一个…

作者头像 李华