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)模式.简 ...
随机推荐
- 【python之路面向对象】初级篇
概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...
- H5C3--边框图片
类似于android的.9图片,目的是为了防止图片因为内容的扩展而导致图片拉伸失真. <!DOCTYPE html> <html lang="en"> &l ...
- linux把普通用户添加到sudo组
一.linux下把普通用户添加到sudo组的方式: 1. root权限下, 先cd到/etc目录下 2. 由于sudoers文件为只读权限,所以需要添加写入权限,chmod u+w sudoers 3 ...
- datetime模块常用函数
import datetime import time # 当前时间戳 now = time.time() print(now) # 时间戳转换成时间元祖 now = time.localtime(n ...
- beego应用做纯API后端如何使用jwt实现无状态权限验证
jwt是什么,可以百度下其它文章,我原来看到一个讲的详细的,现在找不到了.先简单介绍下我个人的理解,就是一个token,只不过通过加密解密的手段,能让这一串字符带有一些简单的信息.这样解密jwt后不用 ...
- 关于python的元组操作
关于元组: 元组和列表是类似的,但是元组中的数据是不可以修改的. 元组是一对 () 元组操作: 元组是不可以修改的所以对元组的操作极少 定义空元组(因为元组一旦创建,数据不可被修改,所以极少创建空元组 ...
- neo4j批量导入neo4j-import
neo4j数据批量导入 1 neo4j基本参数 1.1 启动与关闭: 1.2 neo4j-admin的参数:控制内存 1.2.1 memrec 是查看参考内存设置 1.2.2 指定缓存–pagecac ...
- 破逼Json,该死的Json库,操了
jansson,就这个库,破几把玩意,本来很简单的Json,就是简单的字符串操作,ATL一个CString就能解决,QT的QSting也能解决,DELPHI的String也能解决.而这B,非把那么简单 ...
- react仿豆瓣
最近公司在做一个自己内部的图片上传系统,目的是帮助设计人员方便上传图片,用的是vue技术,但是说到vue,可能要提到更早出来的react,react是facebook搞的一套语法糖,也是革命性的用组件 ...
- 【CodeVS】1978 Fibonacci数列3
1978 Fibonacci数列 3 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 青铜 Bronze 题目描述 Description 斐波纳契数列是这样的数列: f1 = 1 f ...