使用org.apache.commons.net.ftp.FTPClient保护FTP

有没有办法用org.apache.commons.net.ftp.FTPClient实现安全的FTP?

如果没有,Java的其他选项有哪些?

您可以使用org.apache.commons.net.ftp。 FTPSClient而不是org.apache.commons.net.ftp。 FTPClient具有安全ftp http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPSClient.html

首先,确保您了解FTPS(安全FTP)和SFTP之间的区别:
FTPS与SFTP对比SCP

如果您需要FTPS(安全FTP),您可以使用FTPSClient而不是Apache Commons库中的FTPClient
https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPSClient.html

如果您需要SFTP,请参阅:
如何通过SFTP从服务器检索文件?
Java SFTP传输库

尝试Java安全通道

它支持SFTP

http://www.jcraft.com/jsch/

示例可以在这里找到

Apache FTPClient目前不支持SFTP。 但是,您可以使用JSch – Java Secure Channel。

Onkar Joshi详细介绍了用于FTP,SFTP,Java中FTPS文件传输的库。

使用JSch与SFTP传输文件的示例如下:

  ... private static final Logger logger = Logger.getLogger(YourClass.class.getName()); public boolean sendDataViaSFTP(String contents) throws Exception { String hostname = ""; String username = ""; String password = ""; String remoteDirectory = ""; int ftpPort = 22; logger.info("*** Creating FTP session. ***"); JSch jsch = new JSch(); Session session = null; Channel channel = null; ChannelSftp c = null; //Now connect and SFTP to the SFTP Server try { //Create a session sending through our username and password session = jsch.getSession(username, hostname, ftpPort); logger.info("*** FTP Session created. ***"); session.setPassword(password); //Security.addProvider(new com.sun.crypto.provider.SunJCE()); //Setup Strict HostKeyChecking to no so we dont get the //unknown host key exception Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); logger.info("*** Session connected. ***"); //Open the SFTP channel logger.info("*** Opening FTP Channel. ***"); channel = session.openChannel("sftp"); channel.connect(); c = (ChannelSftp) channel; //Change to the remote directory logger.info("*** Changing to FTP remote dir: " + remoteDirectory + " ***"); c.cd(remoteDirectory); //Send the file we generated try { String filename = "myfile.txt"; logger.info("*** Storing file as remote filename: " + filename + " ***"); ByteArrayInputStream bis = new ByteArrayInputStream(contents.getBytes()); c.put(bis, filename); return true; } catch (Exception e) { logger.info("*** Storing remote file failed. " + e.toString() + " ***"); throw e; } } catch (Exception e) { logger.info("*** Unable to connect to FTP server. " + e.toString() + " ***"); throw e; } finally { // //Disconnect from the FTP server // try { if(session != null) session.disconnect(); if(channel != null) channel.disconnect(); if(c != null) c.quit(); } catch (Exception exc) { logger.severe("*** Unable to disconnect from FTP server. " + exc.toString()+" ***"); } logger.info("*** SFTP Process Complete. ***"); } } ... 

如何尝试Apache Camel,

http://camel.apache.org/ftp2.html