【问题标题】:inputstream is closed error while uploading zip file through jsch to sftp site通过jsch将zip文件上传到sftp站点时输入流关闭错误
【发布时间】:2015-10-29 04:18:10
【问题描述】:

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

【问题讨论】:

    标签: inputstream sftp jsch


    【解决方案1】:

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

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

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

    this.channelSftp.put(inputstream, strFileName);

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

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

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

    【讨论】:

    • 您使用哪种文件名格式?
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢。强化非生产服务器有什么意义?
    • @ChhornElit 公司政策很遗憾。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        最近更新 更多