/**
* 建立FTP链接,FTP服务器地址、端口、登陆用户信息都在配置里配置即可。
* @throws IOException
*/
public boolean connectFtp(String ftpAddress, String ftpPort, String frpUserName, String frpPassword) throws IOException{
log.info("*****连接FTP服务器...*****");
try{
ftpClient.connect(ftpAddress, Integer.valueOf(ftpPort).intValue());
ftpClient.setControlEncoding("GB2312");
int reply = ftpClient.getReplyCode();
if(FTPReply.isPositiveCompletion(reply)){
if(ftpClient.login(frpUserName,frpPassword)){
log.info("*****连接FTP服务器成功!*****");
return true;
}
}else{
log.error("*****连接失败!响应代码为【"+ reply+"】*****");
}
disconnect();
}catch (Exception e) {
log.error("*****连接失败:" + e.getMessage());
}
return false;
} /**
* 设置FTP客户端 被动模式、数据模式为二进制、字符编码GBK
*/
public void setConnectType(){
try {
ftpClient.enterLocalPassiveMode();
ftpClient.setDefaultTimeout(1000 * 120);//120秒
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.setControlEncoding("GB2312");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 断开与远程服务器的连接
* @throws IOException
*/
public void disconnect() {
if(ftpClient.isConnected()){
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
* 过滤不符合的文件并批量下载
* @param remoteFileReg 文件前缀的正则表达式
* @param localPath 本地路径 .property 文件配置
* @param remote_down_path ftp文件路径
* @return List 下载到本地的文件路径 集合
* @throws IOException
*/
@SuppressWarnings("unchecked")
public List downloads(String remoteFileReg,String localPath,String remote_down_path) throws IOException{
List<String> fileNames = new ArrayList<String>();
log.info("*****转移到服务器目录:" + remote_down_path);
setConnectType();
boolean changeFlag = ftpClient.changeWorkingDirectory(remote_down_path);
FTPFile[] files = ftpClient.listFiles();
//String[] names = ftpClient.listNames();
log.info("*****改变目录是否成功:" + changeFlag);
log.info("*****服务器上report目录下所有校验报告的文件数为:【" +files.length + "】" );
if(files.length == 0){
log.info("*****未在服务器上找到文件!*****");
return null;
}else{//目录下有文件
//把 bak文件的前缀找出来 ,区分读取和未读取的xls 和 xlsx ,只下载 未读取的文件
List<String> bakList = new ArrayList<String>();
List<String> list = new ArrayList<String>(); for (int i = 0; i < files.length; i++) {
FTPFile ftpFile = files[i];
String fileName = ftpFile.getName(); if(!fileName.endsWith(".bak") && ftpFile == null){
log.info("******* "+ fileName + "文件无数据!");
continue;
}
//匹配指定的文件前缀 和后缀 为 .bak 格式的文件
//bak 文件是文件读取完毕后生成的标记文件
Pattern bak = Pattern.compile("^"+remoteFileReg+"\\.bak");
Matcher m = bak.matcher(fileName);
if (m.find()) {
//取.bak文件的 前缀
//System.out.println(fileName);
//System.out.println(fileName.split("\\.")[0]);
bakList.add(fileName.split("\\.")[0]);
continue;
} //匹配指定的文件前缀 和后缀 为 .xls .xlsx 格式的文件
//TODO 以后遇到其他的格式文件 需要把后缀抽出来作为参数传入
Pattern xls = Pattern.compile("^"+remoteFileReg+"\\.xls$"+"|"+"^"+remoteFileReg+"\\.xlsx$"+"|"+"^"+remoteFileReg+"\\.csv$");
Matcher mm = xls.matcher(fileName);
if(mm.find()){
list.add(fileName);
continue;
}
} Iterator<String> it = list.iterator();
while (it.hasNext()) {
String xls = it.next();
for (int i = 0; i < bakList.size(); i++) {
String bak = bakList.get(i);
//bak文件存在 , 去掉此文件
if (xls.indexOf(bak) !=-1) {
it.remove();
bakList.remove(i);
}
}
} for (String fFile : list) {
//下载未读取的文件
File downFile = new File(localPath + fFile);
//System.out.println(localPath);
File downPath = new File(localPath);
if(!downPath.exists()){
downPath.mkdirs();
}
String fileDir = remote_down_path + fFile;
OutputStream os = new FileOutputStream(downFile);
ftpClient.retrieveFile(new String(fileDir.getBytes("GB2312"),"ISO-8859-1"), os);
log.info("*****文件已下载到:" + downFile.getAbsolutePath() + "******");
fileNames.add(downFile.getAbsolutePath());
os.close();
}
log.info("**** 此次共下载了【"+list.size()+"】个文件! *****");
}
return fileNames;
} /**
* 上传标志文件
* @param remoteFile
* @param localFile
* @return
*/
public boolean upload(String localFileName,String remoteFileName){ boolean b = false;
try {
File file = new File(localFileName);
FileInputStream input = new FileInputStream(file);
b = ftpClient.changeWorkingDirectory(remoteFileName);
log.info("*****改变目录是否成功:" + b);
String remoteFile = remoteFileName + file.getName();
b = ftpClient.storeFile(new String(remoteFile.getBytes("GB2312"),"ISO-8859-1"), input);
if(b){
log.info(" ****** 标志文件"+localFileName+"上传成功!");
}
input.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return b;
}

ftp 根据特定正则匹配文件名 下载到本地 并且上传文件到ftp java *** 最爱那水货的更多相关文章

  1. .Net 上传文件到ftp服务器和下载文件

    突然发现又很久没有写博客了,想起哎呦,还是写一篇博客记录一下吧,虽然自己还是那个渣渣猿. 最近在做上传文件的功能,上传到ftp文件服务器有利于管理上传文件. 前面的博客有写到layui如何上传文件,然 ...

  2. java 上传文件到 ftp 服务器

    1.  java 上传文件到 ftp 服务器 package com.taotao.common.utils; import java.io.File; import java.io.FileInpu ...

  3. java 上传文件到FTP(centos中的ftp服务)

    ftp服务器系统:centos7 提供ftp的服务:vsftpd pom.xml 依赖 <dependency> <groupId>commons-net</groupI ...

  4. JAVA上传文件到FTP上

    添加maven <!-- https://mvnrepository.com/artifact/commons-net/commons-net --> <dependency> ...

  5. Linux上F上传文件到FTP服务器

    Linux上上传跟Windows上上传不一样,在Windows上测试没问题,但是放到Linux服务器上跑,上传的文件中文显示乱码.解决方案: FtpUtil.java红色标记处 package cn. ...

  6. Android上传文件之FTP

    android客户端实现FTP文件(包括图片)上传应该没什么难度.写下来就了为了记录一下,望能帮到新手. 需要用到 commons-net-3.0.1.jar,后面附上jar包. 直接上代码: /** ...

  7. Android 上传文件到 FTP 服务器

    实现背景 近期接触到一个需求,就是将文件从Android系统上传到FTP服务器,虽然之前接触过FTP服务器,了解基本的使用流程,但是将此流程从使用习惯转化为代码实现还是有一定难度的.但是基本的流程还是 ...

  8. asp.net 服务器 上传文件到 FTP服务器

    private string ftpServerIP = "服务器ip";//服务器ip private string ftpUserID = "ftp的用户名" ...

  9. 【python】用python脚本Paramiko实现远程执行命令、下载、推送/上传文件功能

    Paramiko: paramiko模块,基于SSH用于连接远程服务器并执行相关操作. SSHClient: 用于连接远程服务器并执行基本命令 SFTPClient: 用于连接远程服务器并执行上传下载 ...

随机推荐

  1. golang reflect

    golang reflect go语言中reflect反射机制.详细原文:地址 接口值到反射对象 package main import ( "fmt" "reflect ...

  2. 《Spark快速大数据分析》—— 第五章 数据读取和保存

    由于Spark是在Hadoop家族之上发展出来的,因此底层为了兼容hadoop,支持了多种的数据格式.如S3.HDFS.Cassandra.HBase,有了这些数据的组织形式,数据的来源和存储都可以多 ...

  3. iOS开发--应用崩溃日志揭秘(二)

    场景 4: 吃棒棒糖时闪退! 用户邮件说, “当rage master吃棒棒糖时应用就闪退…” 另一用户说, “我让rage master 吃棒棒糖,没几次应用就闪退了!”崩溃日志如下: Incide ...

  4. SQL 必知必会

    本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...

  5. 解密jQuery事件核心 - 绑定设计(一)

    说起jQuery的事件,不得不提一下Dean Edwards大神 addEvent库,很多流行的类库的基本思想从他那儿借来的 jQuery的事件处理机制吸取了JavaScript专家Dean Edwa ...

  6. lua中的string类型

    在lua中用union TString来表示字符串类型 lobject.h: 其中结构体tsv中 reserved字段表示字符串是不是保留关键字,hash是其哈希值,len是其长度.我们在TStrin ...

  7. 【求助】WPF 在XP下 有的Textbox光标会消失

    最近做个项目,一直有一个问题没有解决,就是在XP下,有的Textbox里在文本框里没有东西的时候,会没有光标.不同的XP机器,失去光标的Textbox也不一样. 各位大师看下面的三张图,当Textbo ...

  8. 深入学习jQuery选择器系列第二篇——过滤选择器之子元素选择器

    × 目录 [1]通用形式 [2]反向形式 [3]首尾元素 [4]唯一元素 前面的话 在上一篇中已经介绍过基础选择器和层级选择器,本文开始介绍过滤选择器.过滤选择器是jQuery选择器中最为庞大也是最为 ...

  9. android 如何获取手机的图片、视频、音乐

    在android 开发中,很多时候,我们会需要调用到用户本机的照片.视频或者是音乐让用户选择,来进行我们APP对应的操作. button.setOnClickListener(new OnClickL ...

  10. 1Z0-053 争议题目解析697

    1Z0-053 争议题目解析697 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 697.Which statement is true about a Scheduler-gen ...