【问题标题】:JSch "pipe closed" when using SFTP download InputStream after disconnect断开连接后使用SFTP下载InputStream时JSch“管道关闭”
【发布时间】:2020-07-10 12:09:05
【问题描述】:

我正在使用 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() 和/或disconnect() 方法,将会抛出Pipe closed 异常
  2. 如果不这样做,我的方法会成功返回 Resource,但通道/会话仍处于 connected 状态。

所以我对这个实现有一个问题,是否有问题?如果没有,会话数量是否会增加,直到 SFTP 服务器拒绝或将来一次关闭,我该如何处理?

在此感谢您

【问题讨论】:

    标签: java sftp inputstream jsch


    【解决方案1】:

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

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


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

    【讨论】:

    • 非常感谢@Martin,因为我的应用程序用于下载小文件,所以我认为上述解决方案是可以接受的
    【解决方案2】:

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

    【讨论】:

    • 实际上我使用这种方法在我的Web应用程序(春季启动)中下载文件(表单远程服务器),所以尽管将文件下载到本地目的地,我如何才能将此文件推送到客户端目录(如/temp)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    相关资源
    最近更新 更多