FTP上传、下载文件Demo
前言:最近在做一个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的更多相关文章
- FTP上传下载文件(函数简易版)
FTP上传下载文件(函数简易版) # 服务端 import socket import json import hashlib import struct import os user_dic = { ...
- java客户端调用ftp上传下载文件
1:java客户端上传,下载文件. package com.li.utils; import java.io.File; import java.io.FileInputStream; import ...
- shell ftp上传下载文件
1. ftp自动登录批量下载文件. #####从ftp服务器上的/home/data 到 本地/home/databackup#### #!/bin/bash ftp -n<<! open ...
- shell脚本实现ftp上传下载文件
前段时间工作中需要将经过我司平台某些信息核验数据提取后上传到客户的FTP服务器上,以便于他们进行相关的信息比对核验.由于包含这些信息的主机只有4台,采取的策略是将生成的4个文件汇集到一个主机上,然后在 ...
- FTP上传下载文件(面向对象版)
# 服务端 import socketserver import os import json import hashlib import struct class MySocketServer(so ...
- python实现支持目录FTP上传下载文件的方法
#!/usr/bin/env python # -*- coding: utf-8 -*- import ftplib import os import sys class FTPSync(objec ...
- 如何通过SecureCRT FTP上传下载文件
通过SecureCRT FTP方式从一台机器下载文件到另一台机器上: [root@TEST144239 ~]# ftp 10.30.1.25 Connected to 10.30.1.25 (10. ...
- ftp上传下载文件
客户端client: import os import json import socket import struct sk = socket.socket() sk.connect(('127.0 ...
- shell通过ftp实现上传/下载文件
直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...
- JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)
package com.why.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputSt ...
随机推荐
- SUSE CaaS Platform 4 - 安装部署
SUSE CaaS Platform 相关文章 (1)SUSE CaaS Platform 4 - 简介 (2)SUSE CaaS Platform 4 - 安装部署 (3)SUSE CaaS Pla ...
- 【集群监控】Prometheus+AlertManager实现邮件报警
AlertManager下载 https://prometheus.io/download/ 解压 添加配置文件test.yml,配置收发邮件邮箱 Prometheus下载配置参考我的另一篇: htt ...
- Sublime text3 配置c++环境 并设置快捷键
VScode配c++环境太麻烦了 打算用sublime写C++ 记录一下配置过程因为我是有DEV环境的 直接将MINGW64加入环境变量即可 在DEV文件夹下的MinGW64\bin(就是有g++.e ...
- vue使用vant-ui实现上拉加载、下拉刷新和返回顶部
vue使用vant-ui实现上拉加载.下拉刷新和返回顶部 vue现在在移动端常用的ui库有vant-ui和mint-ui,上拉加载.下拉刷新和返回顶部也是移动端最基础最常见的功能.下面就用vant-u ...
- Linux内存描述之内存节点node–Linux内存管理(二)
日期 内核版本 架构 作者 GitHub CSDN 2016-06-14 Linux-4.7 X86 & arm gatieme LinuxDeviceDrivers Linux内存管理 #1 ...
- Java中Integer与int对比的一些坑
Integer与int类型的关系 Integer是int的包装类,int的默认值是0,而Integer的默认值是null(我们经常在代码中使用的Integer.valueOf() 和xx.intVal ...
- Have a Good Attitude 良好的态度
Poor attitudes lead to poor communication. Poor communication leads to poor service. Poor service le ...
- PTA 7-3 编辑距离问题 (30 分)
一.实践题目 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字符串B.这里所说的字符操作包括: ()删除一个字符: ()插入一个字符: ()将一个字符改为另一个字符. 将字符串A变换为字符串 ...
- 第3章(1) Linux内核相关概念
Linux内核的组成 1. Linux内核源代码的目录结构 arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如 i386.arm. arm64.powerpc.mips 等.Linu ...
- Redis 3.0中文版学习(一)
网址:http://wiki.jikexueyuan.com/project/redis-guide/entry-to-master-a.html http://www.yiibai.com/redi ...