ftp下载文件

 1 import org.apache.commons.net.ftp.FTP;  2 import org.apache.commons.net.ftp.FTPClient;  3 import org.apache.commons.net.ftp.FTPFile;  4 import org.apache.commons.net.ftp.FTPReply;  5 import org.slf4j.Logger;  6 import org.slf4j.LoggerFactory;  7 import org.springframework.beans.factory.annotation.Value;  8 
 9 import java.io.File;  10 import java.io.FileOutputStream;  11 import java.io.IOException;  12 import java.io.OutputStream;  13 
 14 public class FtpUtil {  15 
 16     private static final Logger logger= LoggerFactory.getLogger(FtpUtil.class);  17     //ftp服务器地址
 18     @Value("${ftp.hostname}")  19     public String hostname;  20     //ftp服务器端口号
 21     @Value("${ftp.port}")  22     public String port;  23     //ftp登陆帐号
 24     @Value("${ftp.username}")  25     public String username;  26     //ftp登陆密码
 27     @Value("${ftp.password}")  28     public String password;  29     private FTPClient ftpClient = null;  30     private OutputStream os = null;  31     /**
 32  * FTP下载文件  33  * @param pathname 目标文件目录路径  34  * @param filename 文件名称(带后缀)  35  * @param localpath 本地存放路径  36  * @return
 37      */
 38     public boolean downloadFile(String pathname, String filename, String localpath) {  39         boolean flag = false;  40         try {  41             LOGGER.info("开始下载文件");  42  getFtpClient();  43             // ftpClient.enterLocalActiveMode();// 主动模式
 44             ftpClient.enterLocalPassiveMode();// 被动模式
 45  ftpClient.changeWorkingDirectory(pathname);  46             //读取文件
       FTPFile[] ftpFiles = ftpClient.listFiles(); 48 for(FTPFile file : ftpFiles) { 49 if (filename.equalsIgnoreCase(file.getName())) { 50 File localFile = new File(localpath); 51 if (!localFile.exists()){ 52 localFile.mkdirs(); 53 } 54 localFile = new File(localpath + File.separator + file.getName()); 55 os = new FileOutputStream(localFile); 56 ftpClient.retrieveFile(file.getName(), os); 57 os.close(); 58 } 59 } 60 ftpClient.logout(); 61 flag = true; 62 logger.info("下载文件成功"); 63 } catch (Exception e) { 64 logger.info("下载文件失败,失败缘由:" + e.getMessage(), e); 65 } finally { 66 close(); 67 } 68 return flag; 69 } 70 71 private FTPClient getFtpClient() { 72 ftpClient = new FTPClient(); 73 ftpClient.setControlEncoding("utf-8"); 74 try { 75 logger.info("connecting...ftp server:" + this.hostname + ":" + this.port); 76 ftpClient.connect(hostname, Integer.valueOf(port)); //链接ftp服务器 77 ftpClient.login(username, password); //登陆ftp服务器 78 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 79 int replyCode = ftpClient.getReplyCode(); //是否成功登陆服务器 80 if (!FTPReply.isPositiveCompletion(replyCode)) { 81 logger.info("connect failed...ftp server:" + this.hostname + ":" + this.port); 82 } 83 logger.info("connect success...ftp server:" + this.hostname + ":" + this.port); 84 } catch (Exception e) { 85 logger.error("初始化FTP客户端失败缘由:" + e.getMessage(), e); 86 } 87 return ftpClient; 88 } 89 90 private void close(){ 91 if (ftpClient.isConnected()) { 92 try { 93 ftpClient.disconnect(); 94 } catch (IOException e) { 95 } 96 } 97 if (null != os) { 98 try { 99 os.close(); 100 } catch (IOException e) { 101 } 102 } 103 } 104 }

FTP使用了两个端口, 一个数据端口和一个命令端口(或称为控制端口)。一般21端口是命令端口,20端口是数据端口。当混入主动/被动模式的概念时,数据端口就有可能不是20了java

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

 

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

参考文章:http://my.oschina.net/binny/blog/17469服务器

相关文章
相关标签/搜索