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)模式.简 ...
随机推荐
- TZ_13_Hystix的熔断器
1.作用:当服务繁忙时,如果服务出现异常,不是粗暴的直接报错,而是返回一个友好的提示,虽然拒绝了用户的访问,但是会返回一个结果. 熔断器的三种状态: Closed:关闭状态(断路器关闭),所有请求都正 ...
- 前端(jQuery)(5)-- jQuery AJAX异步访问和加载片段
异步访问 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- 读书笔记--Head First Networking目录
1.解决物理网络 2.规划网络布局 3.工具和故障排除 4.包分析 5.网络设备和流量 6.连接网络的路由器 7.路由协议 8.域名系统 9.监控和故障排除 10.无线网络 11.网络安全 12.网络 ...
- drf作业01
api\urls from django.conf.urls import url from . import views urlpatterns = [ url(r'^cars/$',views.C ...
- java利用JXL导出/生成 EXCEL【my】
一.创建一个excel文件 package test;// 生成Excel的类 import java.io.File; import jxl.Workbook;import jxl.write.La ...
- 手机号测吉凶python代码
根据数理数来测电话后四位吉凶: 数理数 解释批注 0点特殊.......大吉 1大展鸿图.可获成功吉 2一盛一衰.劳而无功凶 3蒸蒸日上.百事顺遂吉 4坎坷前途.苦难折磨凶 5生意欣荣.名利双收吉 6 ...
- 2019阿里云开年Hi购季基础云产品分会场全攻略!
2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...
- 层次分析法MATLAB
输入成对比较矩阵,输出权重值和一致性检验结果. disp('请输入判断矩阵A(n阶)'); A=input('A='); [n,n]=size(A); x=ones(n,100); y=ones(n, ...
- HTML文档与盒子模型
关于HTML 百度百科里是这么说的:超文本标记语言,即HTML(Hypertext Markup Language),是用于描述网页文档的一种标记语言. 为什么叫用于“描述”网页文档的“标记”语言呢? ...
- python学习笔记10--协程、IO、IO多路复用
本节内容 一.协程 1.1.协程概念 1.2.greenlet 1.3.Gevent 1.4.协程之爬虫 1.5.协程之socket 二.论事件驱动与异步IO 三.IO 3.1.概念说明 3.2.IO ...