前言:最近在做一个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. .Net Core 商城微服务项目系列(十):使用SkyWalking构建调用链监控(2019-02-13 13:25)

    SkyWalking的安装和简单使用已经在前面一篇介绍过了,本篇我们将在商城中添加SkyWalking构建调用链监控. 顺带一下怎么把ES设置为Windows服务,cd到ES的bin文件夹,运行ela ...

  2. 【算法随记五】使用FFT变换自动去除图像中严重的网纹。

    这个课题在很久以前就已经有所接触,不过一直没有用代码去实现过.最近买了一本<机器视觉算法与应用第二版>书,书中再次提到该方法:使用傅里叶变换进行滤波处理的真正好处是可以通过使用定制的滤波器 ...

  3. 利用CSS制作图形效果

    前言 关于如何使用CSS来制作图形,比如说圆形,半圆形,三角形等的相关教程还是挺多的,今天我主要想解释一下里面一些demo的实现原理,话不多说,开始吧   以下所有内容只使用一个HTML元素.任何类型 ...

  4. golang学习之路

    目录 go语言介绍 开发环境准备 go语言基础 Go语言常用标准库 数据库相关 前端相关 web开发 go语言介绍 为什么要学习go语言 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置 ...

  5. hadoop之yarn详解(框架进阶篇)

    前面在hadoop之yarn详解(基础架构篇)这篇文章提到了yarn的重要组件有ResourceManager,NodeManager,ApplicationMaster等,以及yarn调度作业的运行 ...

  6. Eclipse的Debug各种视图介绍(二)

    本文链接:https://blog.csdn.net/u011781521/article/details/55000066    http://blog.csdn.net/u010075335/ar ...

  7. linux登录后出现-bash-4.1$

    linux登录后有时候会出现-bash-4.1$ 造成这样的原因: 与这个用户有关环境变量没了,有关的文件被删除.也就是用户的家目录下面 .bash_profile .bashrc 被删除. 解决办法 ...

  8. mysql引号与esc键下方键

    navicat导出数据表发现建表语句如下: create table `product_category` ( `category_id` int not null auto_increment, ` ...

  9. Python3 解决 ModuleNotFoundError: No module named 'pygal.i18n' 问题

    在获取国别码集通过导入模块pygal报以下问题: from pygal.i18n import COUNTRIES  解决方法: 安装模块 pip3 install pygal_maps_world ...

  10. 面试官,Java8 JVM内存结构变了,永久代到元空间

    在文章<JVM之内存结构详解>中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化.作为面试官如果你还不知道,那么面试过程中是不是有些露怯? ...