inputstream在通过jsch上传zip文件到sftp站点时出现关闭错误



在将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

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

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

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

this.channelSftp.put(inputstream,strFileName);

代码不是从另一个方法传递inputstream,而是在调用这个put的方法内部形成inputstream。这没有任何影响。

尝试通过代码将文件上载到sftp站点。引发了相同的错误。

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

我最近遇到了一个类似的问题,在我的案例中,这是使用JSch登录到远程机器时出现的问题。

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

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

Nikola和我也面临着这个问题。这不是由于权限或密码或其他原因造成的问题。我们正在使用CachingSessionFactory。会话由服务器或客户端应用程序任意关闭。我们在另一个StackOverFlow中描述了我们的解决方案:Sftp文件上传失败

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

我尝试了上面的选项,但似乎没有一个适用于我的用例。

在我的用例中,我们使用JSCH并行地将文件上传到sftp。大多数上传都是成功的,但很少有上传失败。

在调查实现时,我发现库从未关闭的池返回连接。在我们的案例中,其中一个线程在另一个并发线程完成上传之前关闭了连接,从而导致IOException: input stream is closed error

我们已经在cachingConnectionFactory上启用了testSession功能。它将返回池连接if it is not closedcan actually list files from the SFTP。这解决了我们的问题。

在此处张贴样本代码

DefaultSftpSessionFactory sessionFactory1 = new DefaultSftpSessionFactory();
    sessionFactory1.setHost("host");
    sessionFactory1.setPort(21);
    sessionFactory1.setUser("userName");
    sessionFactory1.setPassword("password");
    CachingSessionFactory<ChannelSftp.LsEntry> cachingSessionFactory = new CachingSessionFactory<>(sessionFactory, 10);
    cachingSessionFactory.setSessionWaitTimeout(2000);
    cachingSessionFactory.setTestSession(true);`
 

最新更新