java 简单实现FtpClient
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的更多相关文章
- JAVA中使用FTPClient上传下载
Java中使用FTPClient上传下载 在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在c ...
- java简单词法分析器(源码下载)
java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...
- !!转!!java 简单工厂模式
举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...
- JAVA简单Swing图形界面应用演示样例
JAVA简单Swing图形界面应用演示样例 package org.rui.hello; import javax.swing.JFrame; /** * 简单的swing窗体 * @author l ...
- 多元线性回归----Java简单实现
http://www.cnblogs.com/wzm-xu/p/4062266.html 多元线性回归----Java简单实现 学习Andrew N.g的机器学习课程之后的简单实现. 课程地址:h ...
- java简单数据类型转化
java简单数据类型,有低级到高级为:(byte,short,char)→int→long→float→double (boolean不参与运算转化) 转化可以分为 低级到高级的自动转化 高级到低级的 ...
- 预防和避免死锁的方法及银行家算法的java简单实现
预防死锁 (1) 摒弃"请求和保持"条件 基本思想:规定所有进程在开始运行之前,要么获得所需的所有资源,要么一个都不分配给它,直到所需资源全部满足才一次性分配给它. 优点:简单.易 ...
- Java简单聊天室
实现Java简单的聊天室 所用主要知识:多线程+网络编程 效果如下图 /** * * @author Administrator * * 简单的多人聊天系统——重点:同时性,异步性 * 1.客户端:发 ...
- Java简单工厂模式
Java简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简 ...
随机推荐
- 洛谷P3296 刺客信条
题意: 给你一棵树,有两组01权值a[]和b[].n <= 700 你要构造一个自己到自己的映射,使得整棵树的形态不变,且映射后的a[]和映射之前的b[]中不同元素尽量少. 解: 发现这个整棵树 ...
- django模块安装环境变量
django 模块 一 安装: 方法一: (在 JetBrains PyCharm 2017.2 软件的) 设置 (里找到) 项目:python +(添加) (搜索) django Install p ...
- H5C3--仿京东首页(包含轮播图,倒计时)
!!!很抱歉,之前的域名已经过期了,已经被别人购买了拿去做菠菜了,现在的话,京东页面我重新发布一下代码 #请看注意事项,因为有模拟请求,请在本地服务器或者IDEA类编译器打开(2019年10月10日0 ...
- 【JZOJ5363】【NOIP2017提高A组模拟9.14】生命之树 Trie+启发式合并
题面 45 在比赛中,我只想到了45分的暴力. 对于一个树中点对,相当于在他们的LCA及其祖先加上这个点对的贡献. 那么这个可以用dfs序+树状数组来维护. 100 想法 我想到了可能要用trie树来 ...
- php数字转人民币金额大写
numToRmb.php <?php header("content-type:text/html;charset=utf-8"); function numToRmb($n ...
- dede list调用 内容模型 附件
当我们在list列表页调用内容模型的附件时,会调用出来一个表,数据被包含在表格里面 下面修改这个表格 找到 templets>system>channel_addon.htm文件 < ...
- 洛谷1081 (NOIp2012) 开车旅行——倍增预处理
题目:https://www.luogu.org/problemnew/show/P1081 预处理从每个点开始a能走多少.b能走多少.可以像dp一样从后往前推. 但有X的限制.所以该数组可以变成倍增 ...
- new操作符实现过程
var obj = new Object(); //创建新对象 一. new是干嘛的? new操作符用来生成一个新的对象, 它后面必须跟上一个函数(否则, 会抛出TypeError异常), 这个函数就 ...
- 【JZOJ5060】【GDOI2017第二轮模拟day1】公路建设 线段树+最小生成树
题面 在Byteland一共有n 个城市,编号依次为1 到n,它们之间计划修建m条双向道路,其中修建第i 条道路的费用为ci. Byteasar作为Byteland 公路建设项目的总工程师,他决定选定 ...
- Java1.8新特性 - Stream流式算法
一. 流式处理简介 在我接触到java8流式数据处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现.比如我们希望对一个包 ...