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. BZOJ 4554: [Tjoi2016&Heoi2016]游戏

    Time Limit: 20 Sec Memory Limit: 128 MB Submit: 951 Solved: 572 [Submit][Status][Discuss] Descriptio ...

  2. clientHeight、offsetHeight 区别 笔记

    一张图 说明全部 clientHeight和clientWidth用于描述元素内尺寸,是指元素内容+内边距大小,不包括边框(低版本IE下实际包括).外边距.滚动条部分 offsetHeight和off ...

  3. JavaScript实现继承的方式和各自的优缺点

    ECMAscript只支持实现继承,主要是依靠原型链来实现的. JavaScript实现继承的方式: 类式继承 构造函数继承 组合继承 寄生组合式继承 1.类式继承 //类式继承 //声明父类 fun ...

  4. 20190828 [ Night ] - 弋

    半集训可还行…… 半集训第一次模拟 考试过程 好像是上回的同套题. ××内个$\text{english}$真毒瘤 T1 什么玩意? $chinese$? 前面两句背景是个? 需要$\Theta(1) ...

  5. ubuntu setup.py 安装时报Error -5 while decompressing data: incomplete or truncated stream

    缺少 python-devel 包 apt-get install python-dev -y

  6. SpringCloud-微服务的注册与发现Eureka

    一.SpringCloud简介 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均 ...

  7. dede list调用 内容模型 附件

    当我们在list列表页调用内容模型的附件时,会调用出来一个表,数据被包含在表格里面 下面修改这个表格 找到  templets>system>channel_addon.htm文件 < ...

  8. SPFA(Bellman-Ford队列优化)

    原理:队列+松弛操作 将源点加入队尾,每一步读取队头顶点u,并将队头顶点u出队(记得消除标记):将与点u相连的所有点v进行松弛操作,如果能更新距离(即令d[v]变小),那么就更新,另外,如果点v没有在 ...

  9. 【P3056】【USACO12NOV】笨牛Clumsy Cows

    P3056 [USACO12NOV]笨牛Clumsy Cows 题目描述 Bessie the cow is trying to type a balanced string of parenthes ...

  10. config.js配置页面中的样式和图片路径

    这个文章用在什么地方,我先说一下,上周啊,我接到一个任务.因为公司业务要对接不同的银行,例如在工行下颜色是红色的,在其他银行下默认为蓝色,所以在页面一致的情况下,保证页面中的按钮和ICON是可以配置的 ...