首页 > 解决方案 > SFTP 默认会话工厂或 SFTP 普通连接,用于将文件上传到多个远程服务器

问题描述

我确实根据客户在我们的应用程序中配置了多个远程服务器。

当为该特定客户准备好报告时,我应该连接到该特定客户的远程服务器并上传报告文件。

我面前有两个选项 a) 使用 Spring 的默认会话工厂(为每个文件上传获取会话工厂)

    public SessionFactory<LsEntry> sftpSessionFactory() {
        DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
        factory.setHost(sftpHost);
        factory.setPort(sftpPort);
        factory.setUser(sftpUser);
        if (sftpPrivateKey != null) {
            factory.setPrivateKey(sftpPrivateKey);
            factory.setPrivateKeyPassphrase(sftpPrivateKeyPassphrase);
        } else {
            factory.setPassword(sftpPasword);
        }
        factory.setAllowUnknownKeys(true);
        return factory;
    }

    @Bean
    @ServiceActivator(inputChannel = "toSftpChannel")
    public MessageHandler handler() {
        SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
        handler.setRemoteDirectoryExpression(new LiteralExpression(sftpRemoteDirectory));
        handler.setFileNameGenerator(new FileNameGenerator() {
            @Override
            public String generateFileName(Message<?> message) {
                if (message.getPayload() instanceof File) {
                    return ((File) message.getPayload()).getName();
                } else {
                    throw new IllegalArgumentException("File expected as payload.");
                }
            }
        });
        return handler;
    }

b) 使用普通的 sftp 连接

 try {
        JSch jsch = new JSch();
        Session session = jsch.getSession("sftpuser", "sftphost");
        session.setPassword("sftppassword");
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        config.put("PreferredAuthentications",
                "publickey,keyboard-interactive,password");

        session.setConfig(config);
        session.connect();
        Channel channel = session.openChannel("sftp");
        channel.connect();
        System.out.println("sftp channel opened and connected.");
        ChannelSftp channelSftp = (ChannelSftp) channel;

哪一个更适合这个用例?

标签: javaspringspring-bootsshspring-integration-sftp

解决方案


第二个选项由第一个选项使用。因此,在您的情况下,如果您使用的是 spring 框架,请使用第一个选项。如果您不使用弹簧,请使用第二个选项。

使用 Spring,您可以在用例中使用一些工具。


推荐阅读