springboot集成ftp

 

pom依赖包

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

  

ftp登录初始化

private FTPClient connectFtpServer(){
FTPClient ftpClient = new FTPClient();
ftpClient.setConnectTimeout(1000*30);//设置连接超时时间
ftpClient.setControlEncoding("utf-8");//设置ftp字符集
ftpClient.enterLocalPassiveMode();//设置被动模式,文件传输端口设置
try {
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);//设置文件传输模式为二进制,可以保证传输的内容不会被改变
ftpClient.connect(url);
ftpClient.login(userName,password);
int replyCode = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)){
LOGGER.error("connect ftp {} failed",url);
ftpClient.disconnect();
return null;
}
LOGGER.info("replyCode==========={}",replyCode);
} catch (IOException e) {
LOGGER.error("connect fail ------->>>{}",e.getCause());
return null;
}
return ftpClient;
}

  

ftp上传文件

/**
*
* @param inputStream 待上传文件的输入流
* @param originName 文件保存时的名字
*/
public void uploadFile(InputStream inputStream, String originName){
FTPClient ftpClient = connectFtpServer();
if (ftpClient == null){
return;
} try {
ftpClient.changeWorkingDirectory(remoteDir);//进入到文件保存的目录
Boolean isSuccess = ftpClient.storeFile(originName,inputStream);//保存文件
if (!isSuccess){
throw new BusinessException(ResponseCode.UPLOAD_FILE_FAIL_CODE,originName+"---》上传失败!");
}
LOGGER.info("{}---》上传成功!",originName);
ftpClient.logout();
} catch (IOException e) {
LOGGER.error("{}---》上传失败!",originName);
throw new BusinessException(ResponseCode.UPLOAD_FILE_FAIL_CODE,originName+"上传失败!");
}finally {
if (ftpClient.isConnected()){
try {
ftpClient.disconnect();
} catch (IOException e) {
LOGGER.error("disconnect fail ------->>>{}",e.getCause());
}
}
}
}

  

ftp读取文件,并转成base64

/**
* 读ftp上的文件,并将其转换成base64
* @param remoteFileName ftp服务器上的文件名
* @return
*/
public String readFileToBase64(String remoteFileName){
FTPClient ftpClient = connectFtpServer();
if (ftpClient == null){
return null;
} String base64 = "";
InputStream inputStream = null; try {
ftpClient.changeWorkingDirectory(remoteDir);
FTPFile[] ftpFiles = ftpClient.listFiles(remoteDir);
Boolean flag = false;
//遍历当前目录下的文件,判断要读取的文件是否在当前目录下
for (FTPFile ftpFile:ftpFiles){
if (ftpFile.getName().equals(remoteFileName)){
flag = true;
}
} if (!flag){
LOGGER.error("directory:{}下没有 {}",remoteDir,remoteFileName);
return null;
}
//获取待读文件输入流
inputStream = ftpClient.retrieveFileStream(remoteDir+remoteFileName); //inputStream.available() 获取返回在不阻塞的情况下能读取的字节数,正常情况是文件的大小
byte[] bytes = new byte[inputStream.available()]; inputStream.read(bytes);//将文件数据读到字节数组中
BASE64Encoder base64Encoder = new BASE64Encoder();
base64 = base64Encoder.encode(bytes);//将字节数组转成base64字符串
LOGGER.info("read file {} success",remoteFileName);
ftpClient.logout();
} catch (IOException e) {
LOGGER.error("read file fail ----->>>{}",e.getCause());
return null;
}finally {
if (ftpClient.isConnected()){
try {
ftpClient.disconnect();
} catch (IOException e) {
LOGGER.error("disconnect fail ------->>>{}",e.getCause());
}
} if (inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
LOGGER.error("inputStream close fail -------- {}",e.getCause());
}
} } return base64; }

  

ftp下载文件

/**
* 文件下载
* @param remoteFileName ftp上的文件名
* @param localFileName 本地文件名
*/
public void download(String remoteFileName,String localFileName){
FTPClient ftpClient = connectFtpServer();
if (ftpClient == null){
return ;
} OutputStream outputStream = null; try {
ftpClient.changeWorkingDirectory(remoteDir);
FTPFile[] ftpFiles = ftpClient.listFiles(remoteDir);
Boolean flag = false;
//遍历当前目录下的文件,判断是否存在待下载的文件
for (FTPFile ftpFile:ftpFiles){
if (ftpFile.getName().equals(remoteFileName)){
flag = true;
break;
}
} if (!flag){
LOGGER.error("directory:{}下没有 {}",remoteDir,remoteFileName);
return ;
} outputStream = new FileOutputStream(localDir+localFileName);//创建文件输出流 Boolean isSuccess = ftpClient.retrieveFile(remoteFileName,outputStream); //下载文件
if (!isSuccess){
LOGGER.error("download file 【{}】 fail",remoteFileName);
} LOGGER.info("download file success");
ftpClient.logout();
} catch (IOException e) {
LOGGER.error("download file 【{}】 fail ------->>>{}",remoteFileName,e.getCause());
}finally {
if (ftpClient.isConnected()){
try {
ftpClient.disconnect();
} catch (IOException e) {
LOGGER.error("disconnect fail ------->>>{}",e.getCause());
}
} if (outputStream != null){
try {
outputStream.close();
} catch (IOException e) {
LOGGER.error("outputStream close fail ------->>>{}",e.getCause());
}
}
}
}

  

ftp客户端与服务端之间数据传输,主动模式和被动模式

请移至这个哥们的博文中查看,https://www.cnblogs.com/mawanglin2008/articles/3607767.html,写的非常好。

主动模式:ftp客户端产生一个随机端口,并告知ftp服务端,最后服务端的20端口会与这个随机端口建立连接,进行数据传输

被动模式:ftp服务端产生一个随机端口,并告知ftp客户端,最后客户端与这个随机端口建立连接,进行数据传输

springboot集成ftp的更多相关文章

  1. intellij idea 高级用法之:集成JIRA、UML类图插件、集成SSH、集成FTP、Database管理

    之前写过一篇IntelliJ IDEA 13试用手记,idea还有很多高大上的功能,易用性几乎能与vs.net媲美,反正我自从改用idea后,再也没开过eclipse,今天来看几个高级功能: 一.与J ...

  2. 【springBoot】springBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  3. SpringBoot集成security

    本文就SpringBoot集成Security的使用步骤做出解释说明.

  4. springboot集成Actuator

    Actuator监控端点,主要用来监控与管理. 原生端点主要分为三大类:应用配置类.度量指标类.操作控制类. 应用配置类:获取应用程序中加载的配置.环境变量.自动化配置报告等与SpringBoot应用 ...

  5. SpringBoot集成Shiro并用MongoDB做Session存储

    之前项目鉴权一直使用的Shiro,那是在Spring MVC里面使用的比较多,而且都是用XML来配置,用Shiro来做权限控制相对比较简单而且成熟,而且我一直都把Shiro的session放在mong ...

  6. SpringBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  7. springboot集成mybatis(二)

    上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...

  8. springboot集成mybatis(一)

    MyBatis简介 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyB ...

  9. springboot集成redis(mybatis、分布式session)

    安装Redis请参考:<CentOS快速安装Redis> 一.springboot集成redis并实现DB与缓存同步 1.添加redis及数据库相关依赖(pom.xml) <depe ...

随机推荐

  1. leetcode 947. 移除最多的同行或同列的石头

    题目描述: 在二维平面上,我们将石头放置在一些整数坐标点上.每个坐标点上最多只能有一块石头. 现在,move 操作将会移除与网格上的某一块石头共享一列或一行的一块石头. 我们最多能执行多少次 move ...

  2. 三个基于.net的浏览器内核使用的比较

    最近做模拟登陆发帖相关的项目 分别尝试了基于IE .NET自带的 webbrowser 和 基于WebKit 的WebKit.NET和openWebkitSharp 最开始肯定是用的.NET自带的we ...

  3. 修改mysql存储过程或函数的定义着

    以root用户登录mysql控制台 (1)首先查询 mysql> select definer from mysql.proc; (2)然后根据条件进行更新 update mysql.proc ...

  4. Jumpserver 5.2版本安装与部署

    组件说明 Jumpserver 为管理后台, 管理员可以通过 Web 页面进行资产管理.用户管理.资产授权等操作, 用户可以通过 Web 页面进行资产登录, 文件管理等操作 koko 为 SSH Se ...

  5. 计算几何 + 统计 --- Parallelogram Counting

    Parallelogram Counting Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5749   Accepted: ...

  6. Sitecore安全:访问权限

    由于Sitecore使用Core数据库中的项来定义其用户界面,因此您可以对该数据库中的项应用访问权限,以控制对CMS功能的访问.最常见的是,将用户置于预定义的Sitecore客户端角色中 Siteco ...

  7. SQL Server 中获取一个表的字段信息

    直接贴代码了: SELECT sysobjects.name AS TableName, syscolumns.Id AS TableId, syscolumns.name AS DbColumnNa ...

  8. java基本数据类型的变量

    一.整型变量 短整型(short).整型(int)和长整型(long),它们都可以定义整型变量,但是由于分配的内存空间不同,所能表示的数据的长度也不同. 我们可以定义并初始化一个整型变量: int a ...

  9. maven中pom的继承以及dependencies与dependencyManagement的区别

    https://blog.csdn.net/zzm3280/article/details/84952623 分类专栏: maven   本文转自:https://blog.csdn.net/liut ...

  10. C#生成/调用动态链接库

    参考地址:https://www.cnblogs.com/qq4004229/archive/2013/01/30/2882409.html 一.需求描述 (1)用代码生成动态链接库 (2)用C#代码 ...