【问题标题】:JavaFX How to stop current transfer file SFTPJavaFX 如何停止当前传输文件 SFTP
【发布时间】:2020-09-22 12:29:45
【问题描述】:

我想用stopUpload()方法停止我当前的传输文件:

private ChannelSftp channelSftp

private ChannelSftp setupJsch() throws JSchException {
    JSch jsch = new JSch();
    jsch.setKnownHosts("/Users/john/.ssh/known_hosts");
    Session jschSession = jsch.getSession(username, remoteHost);
    jschSession.setPassword(password);
    jschSession.connect();
    return (ChannelSftp) jschSession.openChannel("sftp");
}

public void stopUpload()
{

   channelSftp.disconnect();

}

public void whenUploadFileUsingJsch_thenSuccess() throws JSchException, SftpException {
    ChannelSftp channelSftp = setupJsch();
    channelSftp.connect();
 
    String localFile = "src/main/resources/sample.txt";
    String remoteDir = "remote_sftp_test/";
 
    channelSftp.put(localFile, remoteDir + "jschFile.txt");
    channelSftp.exit();
}

当 stopUpload() 运行时出现此错误:Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException

【问题讨论】:

    标签: java sftp file-transfer


    【解决方案1】:

    要彻底取消 JSch SFTP 传输,请在需要时实现 SftpProgressMonitor interface

    public class CancellableProgressMonitor implements SftpProgressMonitor {
        private boolean cancelled;
    
        public CancellableProgressMonitor() {}
    
        public void cancel() {
            this.cancelled = true;
        }
    
        public bool wasCancelled() {
            return this.cancelled;
        }
    
        public void init(int op, java.lang.String src, java.lang.String dest, long max) {
            this.cancelled = false;
        }
    
        public boolean count(long bytes) {
            return !this.cancelled;
        }
    
        public void end() {
        }
    }
    

    并将其传递给ChannelSftp.put:

    CancellableProgressMonitor monitor = new CancellableProgressMonitor()
    
    channelSftp.put(localFile, remoteDir + "jschFile.txt", monitor);
    

    当您需要取消转移时,请致电monitor.cancel()

    public void stopUpload() {
        monitor.cancel();
    }
    

    如果要清理部分传输的文件:

    String remoteFile = remoteDir + "jschFile.txt";
    try {
        channelSftp.put(localFile, remoteFile, monitor);
    } catch (IOException e) {
        if (monitor.wasCancelled() && channelSftp.getSession().isConnected()) {
            try {
                channelSftp.rm(remoteFile);
            } catch (SftpException e) {
                if (e.id == SSH_FX_NO_SUCH_FILE) {
                    // can happen if the transfer was cancelled 
                    // before the file was even created
                } else {
                    throw e;
                }
            }
        }
    
        throw e;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-02
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多