断开连接后使用 SFTP 下载 InputStream 时的 JSch "pipe closed"

JSch "pipe closed" when using SFTP download InputStream after disconnect

我正在使用 JSch 打开到远程服务器的 SFTP 通道。我使用以下代码打开连接并下载文件:

public org.springframework.core.io.Resource download(){
    JSch jsch = new Jsch();
    Session session = jsch.get("root", "192.168.1.10", 22);
    session.setPassword("root");
    session.setConfig("StrictHostKeyChecking","no");
    session.connect();
    ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
    channelSftp.connect();
    InputStream is = channelSftp.get("/root/example.mp4");
    channelSftp.exit();
    session.disconnect();
    return new org.springframework.core.io.InputStreamResource(is);    
}

问题是:

  1. 如果我使用exit() and/or disconnect() 方法,将会抛出Pipe closed 异常
  2. 如果我不这样做,我的方法 return 会成功 Resource 但 channel/session 仍处于 connected 状态。

所以我想问一下这个实现是否有问题?如果没有,会话数量会增加直到 SFTP 服务器拒绝,或者它们将在未来某个时间关闭,我该如何处理?

先谢谢你

您不能在调用 disconnect() 后从输入流中读取。首先从流中读取数据然后调用 disconnect(),或者使用 channelSftp.get(sourceDir, destinationDir) 将文件下载到本地文件系统中的本地目标目录中你调用 disconnect().

断开连接后无法访问数据。

如果 API 需要 InputStream,然后您失去了控制权,您可以实现一个包装器 InputStream 实现,将所有调用委托给您的 is,并调用disconnect 一旦 InputStream.close 被调用。


对于不太大的文件,更简单但效率较低的解决方案是将 JSch 流读取到内存(到 byte 数组)和 return 数组或包装器 ByteArrayInputStream到你的 API.