前言:最近在做一个app,负责写后台接口,客户那边给了一个FTP的账号密码过来,服务器上面放了一堆的PDF文件,让我们这边自己从上面拿,项目是spriongboot的,做个记录供以后参考。


一、application.yml文件里面配置FTP的相关参数,以便于后面更改相关参数,而不用去改具体的方法参数

ftp:
#FTP的地址
ftpHost: 192.168.42.18
#FTP的端口
  ftpPort: 21
#连接FTP的账号
  ftpUserName: ****
#账号密码
  ftpPassword: ****
#访问FTP的路径
ftpRemotePath: /
#本地下载路径
ftpLocalPath: D:/

二、准备一个工具类,用于从application.yml文件读取FTP的相关配置

 package com.example.springboot.utils;

 import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yaml.snakeyaml.Yaml; import java.io.*;
import java.util.HashMap;
import java.util.Map; import static java.util.Objects.isNull; /**
* 工具类,从application.yml获取ftp相关参数
*
* @Author: yaodengyan
* @Date: 2019/11/7
* @Version: 1.0
*/
public class YmlUtils {
private static final Logger log = LoggerFactory.getLogger(YmlUtils.class); private static String NAME = "application.yml"; /** 空字符串 */
private static final String NULLSTR = ""; /**
* 当前对象实例
*/
private static YmlUtils ymlUtils; /**
* 保存全局属性值
*/
private static Map<String, String> map = new HashMap<String, String>(); private YmlUtils()
{
} /**
* 静态工厂方法
*/
public static synchronized YmlUtils getInstance()
{
if (ymlUtils == null)
{
ymlUtils = new YmlUtils();
}
return ymlUtils;
} /**
* 获取配置
*/
public static String getConfig(String key)
{
String value = map.get(key);
if (value == null)
{
Map<?, ?> yamlMap = null;
yamlMap = loadYaml(NAME);
value = String.valueOf(getProperty(yamlMap, key));
map.put(key, value != null ? value : "");
}
return value;
} public static Map<?, ?> loadYaml(String fileName)
{
InputStream in = YmlUtils.class.getClassLoader().getResourceAsStream(fileName);
if(isEmpty(fileName)){
return null;
}else { return new Yaml().load(in);
}
} /**
* * 判断一个字符串是否为非空串
*
* @param str String
* @return true:非空串 false:空串
*/
public static boolean isEmpty(String str)
{
Boolean flag = isNull(str) || NULLSTR.equals(str.trim());
return flag;
} public static Object getProperty(Map<?, ?> map, Object qualifiedKey)
{
if (map != null && !map.isEmpty() && qualifiedKey != null)
{
String input = String.valueOf(qualifiedKey);
if (!"".equals(input))
{
if (input.contains("."))
{
int index = input.indexOf(".");
String left = input.substring(0, index);
String right = input.substring(index + 1, input.length());
return getProperty((Map<?, ?>) map.get(left), right);
}
else if (map.containsKey(input))
{
return map.get(input);
}
else
{
return null;
}
}
}
return null;
} /**
* 获取参数不为空值
*
* @param value defaultValue 要判断的value
* @return value 返回值
*/
public static <T> T nvl(T value, T defaultValue)
{
return value != null ? value : defaultValue;
} /**
* 获取FTP的地址
*/
public static String getFtpHost()
{
return nvl(getConfig("ftp.ftpHost"), "");
} /**
* 获取FTP的端口
*/
public static String getFtpPort()
{
return nvl(getConfig("ftp.ftpPort"), "");
}
/**
* 获取连接FTP的账号
*/
public static String getFtpUserName()
{
return nvl(getConfig("ftp.ftpUserName"), "");
}
/**
* 获取账号密码
*/
public static String getFtpPassword()
{
return nvl(getConfig("ftp.ftpPassword"), "");
}
/**
* 获取访问FTP的路径
*/
public static String getFtpRemotePath()
{
return nvl(getConfig("ftp.ftpRemotePath"), "");
}
/**
* 获取本地下载路径
*/
public static String getFtpLocalPath()
{
return nvl(getConfig("ftp.ftpLocalPath"), "");
}
}

注意,这里需要引入的yml解析器的依赖

       <!-- yml解析器 -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>

三、编写连接FTP工具类,用于连接FTP服务器

在项目pom.xml引入两个依赖包,一个是连接ftp需要的,另一个是作为打印日志需要的lombok

      <!--FTP-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
    <!--日志-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>

下面就是连接ftp的工具类

 package com.example.springboot.utils;

 import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply; import java.io.IOException;
import java.net.SocketException; /**
* 连接ftp服务器工具类
*
* @Author: yaodengyan
* @Date: 2019/11/7
* @Version: 1.0
*/
@Slf4j
public class FtpUtils {
public static FTPClient getFTPClient() {
FTPClient ftpClient = new FTPClient();
try {
ftpClient = new FTPClient();
ftpClient.connect(YmlUtils.getFtpHost(), Integer.valueOf(YmlUtils.getFtpPort()));// 连接FTP服务器
ftpClient.login(YmlUtils.getFtpUserName(), YmlUtils.getFtpPassword());// 登陆FTP服务器
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
log.error("未连接到FTP,用户名或密码错误。{}");
ftpClient.disconnect();
} else {
log.info("FTP连接成功{}");
}
} catch (SocketException e) {
e.printStackTrace();
log.error("FTP连接失败");
} catch (IOException e) {
e.printStackTrace();
log.error("FTP的端口错误,请正确配置。");
}
return ftpClient;
}
}

四、编写下载类实现从ftp服务器下载

 package com.example.springboot.utils;

 import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPClient; import java.io.*;
import java.net.SocketException; /**
* ftp文件下载类
*
* @Author: yaodengyan
* @Date: 2019/11/7
* @Version: 1.0
*/
@Slf4j
public class DowdFile {
public static void downloadFile(String fileName) throws IOException {
FTPClient ftpClient = null;
OutputStream os = null;
try {
ftpClient = FtpUtils.getFTPClient();
ftpClient.setControlEncoding("UTF-8"); // 中文支持
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode(); Boolean changeDirectory = ftpClient.changeWorkingDirectory(YmlUtils.getFtpRemotePath());//切换到ftp的目标路径
if (!changeDirectory) {
throw new RuntimeException("切换目录失败");
}
File localFile = new File(YmlUtils.getFtpLocalPath() + File.separatorChar + fileName);
os = new FileOutputStream(localFile); ftpClient.retrieveFile(fileName, os);//开始下载
log.info("文件下载成功");
} catch (FileNotFoundException e) {
log.error("没有找到" + YmlUtils.getFtpRemotePath() + "文件");
e.printStackTrace();
} catch (SocketException e) {
log.error("连接FTP失败.");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
log.error("文件读取错误。");
e.printStackTrace();
}finally {
os.close();
ftpClient.disconnect();
log.info("FTP连接断开");
}
}
}

五、编写上传文件到ftp服务器类

 package com.example.springboot.utils;

 import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; /**
* 类说明
*
* @Author: yaodengyan
* @Date: 2019/11/7
* @Version: 1.0
*/
@Slf4j
public class UploadFile {
public static void uploadFile(String fileName) throws IOException {
FTPClient ftp = null;
FileInputStream input = new FileInputStream(new File(YmlUtils.getFtpLocalPath()+ File.separatorChar+fileName));
try {
ftp = FtpUtils.getFTPClient();
log.info("连接FTP成功!");
ftp.changeWorkingDirectory(YmlUtils.getFtpRemotePath());
ftp.setFileType(FTP.BINARY_FILE_TYPE);
fileName = new String(fileName.getBytes("GBK"),"iso-8859-1");
ftp.storeFile(fileName, input);
log.info("上传成功{}");
} catch (Exception e) {
e.printStackTrace();
log.error("文件上传失败{}");
}finally {
input.close();
ftp.disconnect();
log.info("FTP连接断开{}");
}
} public static void main(String[] args) throws IOException {
uploadFile("test.txt");
}
}

六、测试结果

获取连接

文件下载

在我的D盘可以看到下载的文件:

文件上传:

ftp服务器上面:


七:总结

1.ftp的配置应当写在配置类,方便以后修改。

2.上传下载都是在获得ftp连接的基础上,获得连接也是最重要的一步。

后话:demo是学习一直知识点最好的方式!

FTP上传、下载文件Demo的更多相关文章

  1. FTP上传下载文件(函数简易版)

    FTP上传下载文件(函数简易版) # 服务端 import socket import json import hashlib import struct import os user_dic = { ...

  2. java客户端调用ftp上传下载文件

    1:java客户端上传,下载文件. package com.li.utils; import java.io.File; import java.io.FileInputStream; import ...

  3. shell ftp上传下载文件

    1. ftp自动登录批量下载文件. #####从ftp服务器上的/home/data 到 本地/home/databackup#### #!/bin/bash ftp -n<<! open ...

  4. shell脚本实现ftp上传下载文件

    前段时间工作中需要将经过我司平台某些信息核验数据提取后上传到客户的FTP服务器上,以便于他们进行相关的信息比对核验.由于包含这些信息的主机只有4台,采取的策略是将生成的4个文件汇集到一个主机上,然后在 ...

  5. FTP上传下载文件(面向对象版)

    # 服务端 import socketserver import os import json import hashlib import struct class MySocketServer(so ...

  6. python实现支持目录FTP上传下载文件的方法

    #!/usr/bin/env python # -*- coding: utf-8 -*- import ftplib import os import sys class FTPSync(objec ...

  7. 如何通过SecureCRT FTP上传下载文件

    通过SecureCRT  FTP方式从一台机器下载文件到另一台机器上: [root@TEST144239 ~]# ftp 10.30.1.25 Connected to 10.30.1.25 (10. ...

  8. ftp上传下载文件

    客户端client: import os import json import socket import struct sk = socket.socket() sk.connect(('127.0 ...

  9. shell通过ftp实现上传/下载文件

    直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...

  10. JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)

    package com.why.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputSt ...

随机推荐

  1. Angular 内嵌视图、宿主视图

    解析视图: 内嵌视图 - 连接到模板的嵌入视图,在组件模板元素中添加模板(DOM元素.DOM元素组) 宿主视图 - 连接到组件的嵌入视图,在组件元素中添加别的组件 使用类说明: ElementRef ...

  2. SpringBootSecurity学习(15)前后端分离版之 OAuth2.0简单示例

    OAuth2.0 OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者.客户端来申请资源,资源所有者同意以后,资源服务器可以向客户端颁发令牌.客户端通过令牌,去请求数据.也就是说, ...

  3. 挑战程序设计——迷宫的最短路径(BFS)

    题目详情 Description 给定一个大小为 N * M 的迷宫.迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动.请求出从起点到终点所需的最小步数 限制条件: N,M <= ...

  4. 【Tomcat】tomcat7 设置成系统服务启动

    1.启动cmd 2.cd C:\Program Files\tomcat7\bin 3.service.bat install 4.打开tomcat7w.exe可以启动管理服务

  5. Azure pipeline 配置根据条件执行脚本

    Azure pipeline 配置根据条件执行脚本 Intro 我的应用通过 azure pipeline 来做持续集成,之前已经介绍了根据不同分支去打包不同的package,具体的就不再这里详细介绍 ...

  6. 常见Failed to load ApplicationContext异常解决方案!!

    java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.conte ...

  7. Orecle基本概述(2)

    1.视图1.1 视图介绍*一种虚拟的表,不是真实存在的表,以多种方式展示数据给用户看,1.2 视图使用*创建视图语法一(非只读): create or replace view 视图名字 as sql ...

  8. numpy.random.rand

    numpy.random.rand(d0,d1,...,dn ) 给定形状中的随机值. 创建一个给定形状的数组,并用统一分布的随机样本填充它.[0, 1) 参数: d0,d1,...,dn:int,可 ...

  9. windows 7 专业版 64位 无法安装.Net 4.7版本解决方案

    什么暂停windows update,改文件夹,再恢复windows update等等方法都试了,不行之后就觉得这才是终极解决方案. 不管你是win 7什么版本,你只需要下载安装对应系统的Window ...

  10. USACO环绕岛屿Surround the Islands 并查集 枚举暴力

    题目描述 Farmer John has bought property in the Caribbean and is going to try to raise dairy cows on a b ...