java实现FTP下载文件

时间:2021-04-09 09:56:14

ftp上传下载文件,是遵照ftp协议上传下载文件的,本例仅以下载文件为例。

重要的方法解释:

1.FTP功能相关依赖路径:org.apache.commons.net.ftp.*;

2.ftp默认端口是21,如果非默认端口连接,需指定:ftp.connect(ftphostaddr, 22);//22为端口号

3.ftp.changeWorkingDirectory(ftppath) //实现切换目录

4.FTPFile[] fs = ftp.listFiles(); 获取指定目录下的文件列表

public class FtpTools {
	
    private final static String ftphostaddr = "xxx";//服务器地址
    private final static String ftppath = "xxx";//操作的服务器目录
    private final static String ftpname = "xxx";//服务器登录名
    private final static String ftppwd = "xxx";//登录密码
  
    private final static String localpath = getCurentContentPath()+"uploadfiles";
    private final static String fileSeparator = System.getProperty("file.separator");
    
    private static final Logger LOGGER = Logger.getLogger(FtpTools.class);
    
	public static void main(String[] args) {
		FtpTools tools = new FtpTools();
		tools.downFile("test.txt");
	}
	
	/**
	 * 从文件服务器上下载文件到本地
	 * @param filename
	 */
	 public static void downFile(String filename) {
		 FTPClient ftp = initFtp(); 
		 try{
	            //4.指定要下载的目录  
	            ftp.changeWorkingDirectory(ftppath);// 转移到FTP服务器目录  
	            //5.遍历下载的目录  
	            FTPFile[] fs = ftp.listFiles();  
	            for (FTPFile ff : fs) {  
	                //解决中文乱码问题,两次解码  
	                byte[] bytes=ff.getName().getBytes("iso-8859-1");  
	                String fn=new String(bytes,"utf8");
	                if (fn.equals(filename)) {  
	                    //6.写操作,将其写入到本地文件中  
	                   LOGGER.info("下载文件:"+filename+"开始:"+System.currentTimeMillis());
	                    File localFile = new File(localpath +fileSeparator+ ff.getName());  
	                    OutputStream is = new FileOutputStream(localFile);  
	                    ftp.retrieveFile(ff.getName(), is);
	                    
	                    //7.判断本地文件是否正确写入,如果正确写入,将文件服务器上的文件删除
	                    if(localFile.exists()){
	                    	LOGGER.info("删除服务器上文件:"+filename);
	                    	ftp.deleteFile(ff.getName());
	                    }
	                    LOGGER.info("下载文件:"+filename+"结束:"+System.currentTimeMillis());
	                    is.close();  
	                }  
	            }  
	            ftp.logout();  
		 }catch(Exception e){
			 e.printStackTrace();
			 new Exception("从服务器下载文件过程中发生错误");
		 }finally{
			 if (ftp.isConnected()) {  
	                try {  
	                    ftp.disconnect();  
	                } catch (IOException ioe) {  
	                	ioe.printStackTrace();
	                }  
	            }  
		 }
	 }
	 
	public static FTPClient initFtp() {
		int reply;
		FTPClient ftp = new FTPClient();
		try {
			// 1.连接服务器
			//ftp.connect(ftphostaddr);
			ftp.connect(ftphostaddr, 22);
			// 2.登录服务器 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
			ftp.login(ftpname, ftppwd);
			// 3.判断登陆是否成功
			reply = ftp.getReplyCode();
			if (!FTPReply.isPositiveCompletion(reply)) {
				ftp.disconnect();
			}
		} catch (Exception e) {
			e.printStackTrace();
			new Exception("服务器连接失败");
		}
		return ftp;
	}
	 
	 public static String getCurentContentPath(){
		 String path = "";
		 path = FtpTools.class.getClassLoader().getResource("").toString();
		 path = path.replace("file:", "").substring(0, path.indexOf("WEB-INF")).replace("WEB-IN", "").replace("WEB-I", "");
		 return path;
	 }
}