JAVA ftp获取文件

第一篇文章,毕业后到现在快一年了,之前就有想把项目中一些自研究给写下来,一直没时间,今天抽了时间,写了自己第一篇博客。

回归正题,先介绍一下项目,就是从客户提供的FTP地址下载XML文件与图片,然后解析XML文件里的数据,保存到数据库,然后数据用echarts展示出来。

1.maven

<!-- ftp -->
    <dependency>
	    <groupId>commons-net</groupId>
	    <artifactId>commons-net</artifactId>
	    <version>3.6</version>
	</dependency>
2.配置文件,存ftp的账号密码地址,已经下载文件后的地址:

ftp.username=***
ftp.password=***
ftp.url=****
ftp.port=***  //端口
ftp.downImgUrl=***
ftp.downDayXml=***
ftp.downHourXml=***
3.FTP工具类 包含连接,下载,关闭这三个方法。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.SocketException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
public class FtpUntil {
	
	static Log logger = LogFactory.getLog(FtpUntil.class);
	//账号
	private static String username = Resources.getValue("config.properties","ftp.username");
	//密码
	private static String password = Resources.getValue("config.properties","ftp.password");
	//地址
	private static String ip = Resources.getValue("config.properties","ftp.url");
	//端口号
	private static String port = Resources.getValue("config.properties","ftp.port");
	/**
	 * ftp链接
	 * @param ip  ftp地址
	 * @param username 账号
	 * @param password 密码
	 * @return
	 * @throws IOException 
	 */
	public static FTPClient ftpConnection() throws IOException {
		FTPClient ftpClient = new FTPClient();  
        try {  
            ftpClient.connect(ip, Integer.parseInt(port));  
            ftpClient.login(username, password);  
            int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
            if(!FTPReply.isPositiveCompletion(replyCode)) {
            	ftpClient.disconnect();
            	logger.error("--ftp连接失败--");
                System.exit(1);
            }
            ftpClient.enterLocalPassiveMode();//这句最好加告诉对面服务器开一个端口
        } catch (SocketException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }   
        return ftpClient;  
	}
	
	/**
	 * 下载方法
	 * @param ftpClient FTPClient对象
	 * @param newFileName 新文件名
	 * @param fileName 原文件名
	 * @param downUrl  下载路径
	 * @return
	 * @throws IOException
	 */
	public static boolean downFile(FTPClient ftpClient, String newFileName, String fileName, String downUrl) throws IOException {
		boolean isTrue = false;
		OutputStream os=null;
		File localFile = new File(downUrl + "/" + newFileName); 
        os = new FileOutputStream(localFile); 
        isTrue = ftpClient.retrieveFile(new String(fileName.getBytes(),"ISO-8859-1"), os);
        os.close();
		return isTrue;
	}
	
	
	/**
     * 断开FTP连接
     * @param ftpClient  初始化的对象
     * @throws IOException
     */
    public static void close(FTPClient ftpClient) throws IOException{
        if(ftpClient!=null && ftpClient.isConnected()){
            ftpClient.logout();
            ftpClient.disconnect();
        }
    }
}
 

ftpClient.enterLocalPassiveMode();那个工具类中最重要的就是这句话,网上很多资料都没有加这段代码,这个作用是告诉我们连接的服务器,开一个端口,方便我们下载或者上传,不然有时候服务器安全限值,进入下载代码的时候会卡在那边不动。
4.就是对这个工具类的运用了,我就不贴代码了,因为这个大家情况不一样。还有我懒,后门运用这个我分了好几块,代码都是分开写一小段的。

-----------------------------------2018/05/19

我觉得还是加上运用的方法吧!

这边我只贴出运用的方法,整个类就不贴出来了。


        //文件下载地址
	private static String downUrL = Resources.getValue("config.properties","ftp.downDayXml");
	
	/**
	 * FTP获取数据
         * 这个是因为这么写是因为是定时任务  一步一步的执行
	 * @throws Exception
	 */
	public synchronized void getFtpDayXml() throws Exception {
		//5.执行错误表中未获取的ftp日数据
		this.ftpError();
		//1.进行ftp连接
		FTPClient ftpClient = FtpUntil.ftpConnection();
		Calendar date = Calendar.getInstance();
		this.judeDirExists(downUrL);
		//2.下载最新的xml
		String xmlName = this.downDayXml(ftpClient, date, downUrL);
		if (StringUtil.notBlankAndNull(xmlName)) {
			//3.解析xml,并把数据存入表中
			this.parseXml(xmlName);
		}
		//4.关闭ftp连接
		FtpUntil.close(ftpClient);
	}

/**
	 * 下载文件到本地
	 * @param ftpClient  ftp初始化数据
	 * @param date 下载的时间
	 * @param localpath  下载的目录
	 * @return
	 * @throws TException 
	 */
	private String downDayXml(FTPClient ftpClient, Calendar date, String localpath) throws TException{
		//切换的FTP目录路径
		String pathname = "/AQI/";
            String xmlName = this.getXmlName(date);
        String dayName = null;
        boolean isTrue = false;
        try {
            //切换FTP目录 
        	boolean dir = ftpClient.changeWorkingDirectory(new String(pathname.getBytes(),"ISO-8859-1"));
        	if (dir) {
                        //按网上的资料,下载的时候是去for循环比较文件名的,但是实际中发现取文件名的时候会中文乱码,不管怎么处理都是乱码的
                        //好在这个项目ftp文件的命名都是有规律的,所以会比较好取,如果谁能解决取文件名乱码可以说下
        		isTrue = FtpUntil.downFile(ftpClient, xmlName, xmlName, localpath);
        		dayName = xmlName;
			}else {
				 logger.error("--切换文件夹失败--");
			}
        } catch (Exception e) { 
            logger.error("--下载dayXml文件失败--");
            this.saveErrorLog(xmlName, "下载dayXml文件失败");
            e.printStackTrace(); 
        }  
        if (!isTrue) {
        	logger.error("--下载dayXml文件失败--");
        	dayName = null;
		}
        if (StringUtil.isBlankOrNull(dayName)) {
        	this.saveErrorLog(xmlName, "下载dayXml文件失败");
		}
        return dayName; 	
	}


  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值