第一篇文章,毕业后到现在快一年了,之前就有想把项目中一些自研究给写下来,一直没时间,今天抽了时间,写了自己第一篇博客。
回归正题,先介绍一下项目,就是从客户提供的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;
}