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. 详解手把手Maven搭建SpringMVC+Spring+MyBatis框架(超级详细版)

    转载(https://www.jb51.net/article/130560.htm) SSM(Spring+SpringMVC+Mybatis),目前较为主流的企业级架构方案.标准的MVC设计模式, ...

  2. Cut 命令截取不同空格的string

    eth0      Link encap:Ethernet  HWaddr 00:0C:29:16:79:98 例如这一串中间空格数量不一样cut 是无法截取字段的.所以我们需要把他变成有规律的. 这 ...

  3. es 内存占用优化

    对6.3: 修改Elasticsearch中JVM配置文件jvm.options: Dlog4j2.enable.threadlocals=false 注: 本文主要针对ES 2.x. “该给ES分配 ...

  4. Shell脚本之九 输入输出重定向和文件包含

    输出重定向:是指不使用系统提供的标准输入端口来输出,而是重新指定其他来进行输出.例如在终端输入的字符串本来是要输出到终端屏幕上的,但可以将输出指定为其他文件,将输入字符串输出到该文件中,而不再是屏幕上 ...

  5. linux部署go

    一.下载tar包并解压 yum -y install wget glibc.i686 #后面一个是依赖包,不安装会报错: /lib/ld-linux.so.2: bad ELF interpreter ...

  6. Alpha冲刺(7/10)——2019.4.29

    作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 ...

  7. jquery的Layer弹出框操作

    在layer中,我们要先获取窗口的索引,然后再进行操作. var index = parent.layer.getFrameIndex(window.name); //获取窗口索引 $("# ...

  8. LeetCode 717. 1比特与2比特字符(1-bit and 2-bit Characters)

    717. 1比特与2比特字符 LeetCode717. 1-bit and 2-bit Characters 题目描述 有两种特殊字符.第一种字符可以用一比特0来表示.第二种字符可以用两比特(10 或 ...

  9. CAS自旋volatile变量

    public final int getAndIncrement() { for (;;) { int current = get(); // 取得AtomicInteger里存储的数值 int ne ...

  10. 《即时消息技术剖析与实战》学习笔记1——IM系统的架构

    一.IM的应用场景 聊天.直播.在线客服.物联网等所有需要实时互动.高实时性的场景,都需要应用到 IM 技术.