通过 jsch 将 zip 文件上传到 sftp 站点时出现输入流关闭错误

inputstream is closed error while uploading zip file through jsch to sftp site

将 zip 文件上传到 SFTP 时,出现以下错误。相同的代码在另一个应用程序中运行良好。我们正在使用 jsch-0.1.44.jar 进行 SFTP 连接。

java.io.IOException: inputstream is closed
        at com.jcraft.jsch.ChannelSftp._put(ChannelSftp.java:571)
        at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:431)
        at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:398)
aused by: java.io.IOException: inputstream is closed
        at com.jcraft.jsch.ChannelSftp.fill(ChannelSftp.java:2326)
        at com.jcraft.jsch.ChannelSftp.header(ChannelSftp.java:2350)
        at com.jcraft.jsch.ChannelSftp.checkStatus(ChannelSftp.java:1923)
        at com.jcraft.jsch.ChannelSftp._put(ChannelSftp.java:559)
        ... 6 more

我在互联网上搜索了 Whosebug 和许多其他资源来获得答案。 我发现有两个原因不是我的具体问题的原因。

1) 此异常通常表示连接被突然关闭。我会查看服务器上的日志,看看是否有错误。 2)这个错误的根本原因是在代码中,远程路径被打开了两次。因此,即使实际上没有通道被关闭,但是,当远程路径第二次尝试打开时,现有的 path/channel 也被关闭或者什么的,并且引发了这个异常。

在做了一些 POC 之后,我们对代码所做的任何更改都没有任何影响。其中一件事是将输入流对象作为参数传递给实际调用 channelsftp 的 put 方法的方法。

this.channelSftp.put(输入流,strFileName);

不是从另一个方法传递输入流,而是编写代码以在调用此 put 的方法内形成输入流。这没有任何影响。

尝试通过代码将文件上传到 sftp 站点。抛出了同样的错误。

后来发现没有代码问题。即使是手动上传也失败了。这表明我们要进一步挖掘此 SFTP 参与细节,并发现我们使用的 FILENAME 格式不是 SFTP 配置的格式。当我们匹配文件名格式时,问题就解决了。

我最近遇到了类似的问题,在我的情况下,这是使用 JSch 登录到远程计算机时出现的问题。

尝试手动连接到机器时,我发现密码已过期,并在登录时提示输入新密码。它能够连接并进行身份验证,但是一旦连接就无法进行任何进一步的操作。这解释了为什么它是输入流失败而不是身份验证失败。

我知道这是一个老问题,但对于在网上搜索答案的处于相同位置的其他人来说,这可能只是一个像这样的简单解决方案。

我也有类似的问题。还想补充一点,它与代码无关,而是与访问权限有关。我连接了一个可以通过 ssh 连接但无法通过 stp 发送文件的用户。更改具有适当访问权限的用户解决了问题

Nikola 我也遇到了这个问题。由于权限或密码或其他原因,这不是问题。 我们正在使用 CachingSessionFactory。会话由服务器或客户端应用程序任意关闭。我们在另一个 Whosebug 中描述了我们的解决方案: