1. 引入喜闻乐见的maven地址

 <dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>

2. 代码实现

 import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply; import java.io.*;
import java.time.LocalDate;
import java.util.Objects; /**
* @author <a herf="mailto:yanwu0527@163.com">XuBaofeng</a>
* @date 2019-08-26 14:22.
* <p/>
* description: 简单操作FTP工具类
*/
@Slf4j
public class FtpUtil { private static final String DEFAULT_PATH = "test";
private static final String SEPARATOR = "/"; private static final String FTP_HOST = "192.168.1.158";
private static final Integer FTP_PORT = 21;
private static final String USERNAME = "hoolink";
private static final String PASSWORD = "hoolink123"; private static FTPClient ftpClient;
private static FtpUtil instance; private FtpUtil() {
} static {
instance = new FtpUtil();
ftpClient = new FTPClient();
} /**
* 获取工具类示例
*
* @return FtpUtil
*/
public static FtpUtil getInstance() {
return instance;
} /**
* 初始化FTP
*/
private void initClient(String host, Integer port, String username, String password) {
if (StringUtils.isBlank(host)) {
throw new RuntimeException("init ftp client failed, host is null");
}
// ----- 当端口为空时使用默认端口
port = port == null ? FTP_PORT : port;
try {
ftpClient.setControlEncoding("UTF-8");
// ----- 连接
ftpClient.connect(host, port);
ftpClient.login(username, password);
// ----- 检测连接是否成功
if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
log.info(" ----- connect success ftp server host: {}, post: {}, user: {}", host, port, username);
return;
}
log.error(" ----- connect failed ftp server host: {}, post: {}, user: {}", host, port, username);
} catch (Exception e) {
log.error(" ----- connect failed ftp server, ", e);
}
instance.close();
} /**
* ftp上传文件
*
* @param file 文件
* @param projectId 项目ID
* @return true||false
*/
public String upload(File file, Long projectId, String filePath) {
return instance.upload(FTP_HOST, FTP_PORT, USERNAME, PASSWORD, file, projectId, filePath);
} /**
* 上传文件
*
* @param host ftp服务器地址
* @param port ftp端口
* @param username ftp用户
* @param password ftp密码
* @param file 文件
* @param projectId 项目ID
* @param targetPath 文件存放目录
* @return true||false
*/
public String upload(String host, Integer port, String username, String password,
File file, Long projectId, String targetPath) {
instance.initClient(host, port, username, password);
if (Objects.isNull(ftpClient) || Objects.isNull(file)) {
return null;
}
String filePath = getFilePath(projectId, targetPath);
StringBuilder sb = new StringBuilder();
try (FileInputStream fis = new FileInputStream(file)) {
// ----- 切换到对应目录
changeDirectory(filePath.split(SEPARATOR));
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("GBK");
// ----- 设置文件类型
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// ----- 上传
if (!ftpClient.storeFile(file.getName(), fis)) {
log.error(" ----- upload file failed, projectId: {}, file: {}", projectId, file.getName());
return null;
} else {
sb.append(filePath).append(SEPARATOR).append(file.getName());
log.info(" ----- upload file success, file: {}", sb.toString());
}
} catch (Exception e) {
log.error(" ----- upload file failed, ", e);
} finally {
instance.close();
}
return sb.toString();
} /**
* 删除ftp上的文件
*
* @param target 资源文件
* @return true || false
*/
public boolean remove(String target) {
return instance.remove(FTP_HOST, FTP_PORT, USERNAME, PASSWORD, target);
} /**
* 删除ftp上的文件
*
* @param host ftp服务器地址
* @param port ftp端口
* @param username ftp用户
* @param password ftp密码
* @param target 资源文件
* @return true || false
*/
public boolean remove(String host, Integer port, String username, String password, String target) {
instance.initClient(host, port, username, password);
if (Objects.isNull(ftpClient) || StringUtils.isBlank(target)) {
return false;
}
boolean flag = false;
try {
changeDirectory(splitFtpFilePath(target));
flag = ftpClient.deleteFile(target.substring(target.lastIndexOf(SEPARATOR) + 1));
log.info(" ----- remove file {}, file: {}", flag ? "success" : "failed", target);
} catch (Exception e) {
log.error(" ----- remove file failed, ", e);
} finally {
instance.close();
}
return flag;
} /**
* @param filePath 资源路径
* @param targetPath 目标路径
* @return 文件
*/
public File download(String filePath, String targetPath) {
return download(FTP_HOST, FTP_PORT, USERNAME, PASSWORD, filePath, targetPath);
} /**
* @param host ftp服务器地址
* @param port ftp端口
* @param username ftp用户
* @param password ftp密码
* @param filePath 资源路径
* @param targetPath 目标路径
* @return 文件
*/
public File download(String host, Integer port, String username, String password, String filePath, String targetPath) {
instance.initClient(host, port, username, password);
if (Objects.isNull(ftpClient) || StringUtils.isBlank(filePath)) {
return null;
}
File file = null;
try {
// ----- 切换到对应目录
changeDirectory(splitFtpFilePath(filePath));
// ----- 获取文件名和文件
String fileName = filePath.substring(filePath.lastIndexOf(SEPARATOR) + 1);
FTPFile ftpFile = ftpClient.mdtmFile(fileName);
if (Objects.nonNull(ftpFile)) {
file = new File(targetPath + SEPARATOR + fileName);
// ----- 下载
try (OutputStream out = new FileOutputStream(file)) {
ftpClient.retrieveFile(fileName, out);
}
}
log.info(" ----- download file {}, filePath: {}, targetPath: {}", file != null ? "success" : "failed", filePath, targetPath);
} catch (Exception e) {
log.error(" ----- download file failed, ", e);
} finally {
instance.close();
}
return file;
} /**
* 释放资源
*
* @author tangw 2010-12-26
*/
public void close() {
if (Objects.isNull(ftpClient)) {
return;
}
if (ftpClient.isConnected()) {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException e) {
log.error(" ----- close ftp server failed, ", e);
}
}
} /**
* 切换到对应的目录,当目录不存在时,创建目录
*
* @param filePath 文件目录
*/
private void changeDirectory(String[] filePath) throws Exception {
for (String path : filePath) {
if (StringUtils.isBlank(path) || ftpClient.changeWorkingDirectory(path)) {
continue;
}
ftpClient.makeDirectory(path);
ftpClient.changeWorkingDirectory(path);
}
} /**
* 根据FTP文件地址切割出FTP文件目录
*
* @param filePath 文件地址
* @return 文件所在目录
*/
private String[] splitFtpFilePath(String filePath) {
if (StringUtils.isBlank(filePath)) {
throw new NullPointerException("file path is null");
}
// ----- 去掉尾[文件名]
filePath = filePath.substring(0, filePath.lastIndexOf(SEPARATOR));
return filePath.split(SEPARATOR);
} /**
* 根据项目ID获取目录
*
* @param projectId 项目ID
* @return 目录
*/
private static String getFilePath(Long projectId, String targetPath) {
StringBuilder sb = new StringBuilder();
targetPath = targetPath == null ? DEFAULT_PATH : targetPath;
LocalDate now = LocalDate.now();
return sb.append(targetPath).append(SEPARATOR)
.append(projectId).append(SEPARATOR)
.append(now.getYear()).append(SEPARATOR)
.append(now.getMonthValue()).append(SEPARATOR)
.append(now.getDayOfMonth()).toString();
} public static void main(String[] args) {
FtpUtil instance = FtpUtil.getInstance();
String filePath = "F:\\document\\协议文档\\02 HOOLINK协议\\文档\\HOOLINK传输协议.docx";
String targetPath = "F:\\file";
Long projectId = 269L;
String file = instance.upload(new File(filePath), projectId, DEFAULT_PATH);
instance.download(file, targetPath);
instance.remove(file);
} }

java 简单实现FtpClient的更多相关文章

  1. JAVA中使用FTPClient上传下载

    Java中使用FTPClient上传下载 在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在c ...

  2. java简单词法分析器(源码下载)

    java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...

  3. !!转!!java 简单工厂模式

    举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...

  4. JAVA简单Swing图形界面应用演示样例

    JAVA简单Swing图形界面应用演示样例 package org.rui.hello; import javax.swing.JFrame; /** * 简单的swing窗体 * @author l ...

  5. 多元线性回归----Java简单实现

    http://www.cnblogs.com/wzm-xu/p/4062266.html 多元线性回归----Java简单实现   学习Andrew N.g的机器学习课程之后的简单实现. 课程地址:h ...

  6. java简单数据类型转化

    java简单数据类型,有低级到高级为:(byte,short,char)→int→long→float→double (boolean不参与运算转化) 转化可以分为 低级到高级的自动转化 高级到低级的 ...

  7. 预防和避免死锁的方法及银行家算法的java简单实现

    预防死锁 (1) 摒弃"请求和保持"条件 基本思想:规定所有进程在开始运行之前,要么获得所需的所有资源,要么一个都不分配给它,直到所需资源全部满足才一次性分配给它. 优点:简单.易 ...

  8. Java简单聊天室

    实现Java简单的聊天室 所用主要知识:多线程+网络编程 效果如下图 /** * * @author Administrator * * 简单的多人聊天系统——重点:同时性,异步性 * 1.客户端:发 ...

  9. Java简单工厂模式

    Java简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简 ...

随机推荐

  1. webstorm 2017.3.5之后 激活

    选择"license server" 输入:http://idea.codebeta.cn

  2. JavaScript中[]+[] 、[]+{}、{}+[]、{}+{}的结果分析

    看到这样一个问题:{} + [] 的结果是多少? 一脸懵逼.. 于是在chrome控制台运行 {} + [] 和用 console.log({} + []) 输出,发现结果不一样.. 于是,把各种可能 ...

  3. JavaScript中用var和不用var的区别

    Javascript声明变量的,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的.可以正常运行的代码并不代表是合适的代码. varnum=1; 是在当前域中声 ...

  4. linux 利用 alias 自定义快捷命令

    例如:alias avi='cd /home/study/goodstudy/goodgoodstudy/english/movie/avi'则后续命令行输入 avi , 就自动执行了  cd xxx ...

  5. 【linux配置】Linux同步网络时间

    Linux同步网络时间 1.date '+%Y%M%D' 按照格式显示当前日期,结果如下: [root@LAMP ~]# date "+%Y-%m-%d %H:%M:%S" -- ...

  6. CesiumLab 地形数据处理

    最近接连有用户反应地形数据处理的各种问题,我也是各种测试,想想还是整理一个文档彻底说明一下. 地形栅格数据格式,一般是tif ,也有dem或者img,但是我个人强烈建议使用tif格式,因为cesium ...

  7. win10 下安装 neo4j

    1.neo4j介绍 neo4j是基于Java语言编写图形数据库.图是一组节点和连接这些节点的关系.图形数据库也被称为图形数据库管理系统或GDBMS.详细介绍可看Neo4j 教程 2.安装Java jd ...

  8. 二维vector基本使用

    变量声明 vector<vector<int> > 变量名: 添加行 vector<vector<int> > v2d; for(int i=0;i&l ...

  9. BZOJ 3296: [USACO2011 Open] Learning Languages

    Time Limit: 5 Sec Memory Limit: 128 MB Submit: 387 Solved: 206 [Submit][Status][Discuss] Description ...

  10. NLTK的探索

    import nltk import random from nltk.corpus import movie_reviews documents = [(list(movie_reviews.wor ...