您的位置:首页 > 编程语言 > PHP开发

SFTP服务器文件下载

2017-12-08 14:50 204 查看
1、  下载文件java代码

public class FTPUtils {

private static Logger log = Logger.getLogger(SFTPUtils.class.getName());

public static boolean batchDownload(String
hostname, int port, String username, String password, String pathname,

String localpath) {

PropertyConfigurator.configure(SFTPUtils.class.getClass().getResourceAsStream("/com/nanine/sftp/config/log4j.properties"));

boolean flag = false;

FTPClient ftpClient = new FTPClient();

try {

// 连接FTP服务器

ftpClient.connect(hostname, port);

if (log.isInfoEnabled()) {

log.info("connected to :"+hostname);

}

// 登录FTP服务器

boolean login=ftpClient.login(username,
password);

if (log.isInfoEnabled()&&login) {

log.info("login to :"+hostname);

}

// 验证FTP服务器是否登录成功

int replyCode = ftpClient.getReplyCode();

if (FTPReply.isPositiveCompletion(replyCode))
{

log.info("check to :"+hostname+"is successed");

}

 //设置访问被动模式

ftpClient.setRemoteVerificationEnabled(false);

ftpClient.enterLocalPassiveMode();

// 切换FTP目录

boolean dir=ftpClient.changeWorkingDirectory(pathname);

if(dir)

log.info("chenge directory to"+pathname+"success!");

FTPFile[] ftpFiles = ftpClient.listFiles();

if (log.isInfoEnabled()) {

log.info("The size of file is  :"+ftpFiles.length);

}

for (FTPFile file : ftpFiles) {

if (!file.isDirectory()) {

File localFile = new File(localpath + File.separator
+ file.getName());

OutputStream os = new FileOutputStream(localFile);

ftpClient.retrieveFile(file.getName(),
os);

os.close();

}

}

ftpClient.logout();

flag = true;

} catch (Exception e) {

e.printStackTrace();

} finally {

if (ftpClient.isConnected()) {

try {

ftpClient.logout();

} catch (IOException e) {



}

}

return flag;

}

2、问题: 如若不设置为被动模式,则无法从FTP服务器下载数据

2.1.FTP的PORT(主动模式)和PASV(被动模式)

    (1) PORT(主动模式)

    PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据,原理如下图:



    (2) PASV(被动模式)

    PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输,原理如下图:

 

   2.2.两种模式的比较

     从上面的运行原来看到,主动模式和被动模式的不同简单概述为: 主动模式传送数据时是“服务器”连接到“客户端”的端口;被动模式传送数据是“客户端”连接到“服务器”的端口。

    主动模式需要客户端必须开放端口给服务器,很多客户端都是在防火墙内,开放端口给FTP服务器访问比较困难。

    被动模式只需要服务器端开放端口给客户端连接就行了。

   2. 3.不同工作模式的网络设置

    我在实际项目中碰到的问题是,FTP的客户端和服务器分别在不同网络,两个网络之间有至少4层的防火墙,服务器端只开放了21端口, 客户端机器没开放任何端口。FTP客户端连接采用的被动模式,结果客户端能登录成功,但是无法LIST列表和读取数据。很明显,是因为服务器端没开放被动模式下的随机端口导致。

    由于被动模式下,服务器端开放的端口随机,但是防火墙要不能全部开放,解决的方案是,在ftp服务器配置被动模式下开放随机端口在 50000-60000之间(范围在ftp服务器软件设置,可以设置任意1024上的端口段),然后在防火墙设置规则,开放服务器端50000-60000之间的端口端。

    主动模式下,客户端的FTP软件设置主动模式开放的端口段,在客户端的防火墙开放对应的端口段。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: