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 ...
随机推荐
- android系统中对ffmpeg封装最好的免费SDK
android系统中对ffmpeg封装最好的免费SDK; 无论个人还是公司,都免费商用, 欢迎下载. https://github.com/LanSoSdk/LanSoEditor_common 可能 ...
- .Net Core 商城微服务项目系列(十四):分布式部署携程Apollo构建配置中心
一.开场白 在系统设计里我们有很多配置希望独立于系统之外,而又能够被系统实时读取.但是在传统的系统设计里,配置信息通常是耦合在系统内的,比如.net里通常会放在App.config或者web.conf ...
- MongoDB 基础教程CURD帮助类
最近两天在学习MongoDB,强大的文档数据库.给我最大的感觉就是相比于SQL或者MSQ等传统的关系型数据库,在使用和配置上真的是简化了很多.无论是在集群的配置还是故障转移方面,都省去了许多繁琐的步骤 ...
- vmware上安装centos7虚拟机
1.1 Linux 的安装 安 装 采 用 在 虚 拟 机 中 安 装 , 以 方 便 不 同 班 级 授 课 时 , 需 要 重 复 安装的情况. 1.1.1 配置虚拟机 1. 在 VMware W ...
- C语言复习————基本数据类型、运算符和表达式
数据类型/运算符/表达式 主要分两部分介绍,第一部分介绍常用的数据类型,例如:常量和变量/整型/实型/字符型:第二部分介绍算数运算符和算数表达式以及赋值运算符和逗号运算符. 一. 常用的数据类型 1. ...
- 【MySQL】 用户授权
启动mysql命令符 grant all privileges on mysql.* to 'root'@'%' identified by '123456'; 给mysql用户root授权,'%'表 ...
- asp.net core learn
.NET Core WebApi RESTful规范 RESTful API 最佳实践 理解RESTful架构 接口版本控制 Support multiple versions of ASP.NET ...
- 10月27日Java整理
实验一:凯撒密码 import java.util.Scanner; //zhanxinwu,October,25,2016 public class Addmi { public static vo ...
- 小白学 Python(1):开篇
人生苦短,我用 Python 引言 大家好,可能大家都对我比较熟悉了,不熟悉请去面壁(现在熟悉一下也来得及)~ 简单做一个自我介绍,我是极客挖掘机的唯一作者,一位油腻的 Java 程序员[臭鸡蛋什么的 ...
- ubuntu下安装及配置git的方法
安装Git 一个全新的ubunt系统,需要安装Git(系统是不具有该工具的),方法如下: 在terminel中输入如下命令: sudo apt-get install git git-core git ...