断开连接后使用 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);
}
问题是:
- 如果我使用
exit()
and/or disconnect()
方法,将会抛出Pipe closed
异常
- 如果我不这样做,我的方法 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.
我正在使用 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);
}
问题是:
- 如果我使用
exit()
and/ordisconnect()
方法,将会抛出Pipe closed
异常 - 如果我不这样做,我的方法 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.