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 ...
随机推荐
- 主流视觉SLAM、激光SLAM总结
SLAM预备知识 SLAM for Dummies 全文总结 视觉里程计 卡尔曼滤波推导 MonoSLAM MonoSLAM:Real-Time Single Camera SLAM全文总结 PTAM ...
- 实现一个3D图片轮播插件 —— 更新版
前言: 前段时间写下了之前那篇 3D图片轮播效果,后来发现了 Pedro Botelho 写的jquery.gallery.js ,于是重新修改了自己的这个图片轮播,使之可以成为一个插件来使用 ...
- 从零开始入门 K8s | 应用存储和持久化数据卷:存储快照与拓扑调度
作者 | 至天 阿里巴巴高级研发工程师 一.基本知识 存储快照产生背景 在使用存储时,为了提高数据操作的容错性,我们通常有需要对线上数据进行 snapshot ,以及能快速 restore 的能力.另 ...
- Future类型的连锁的运用
Future类型的连锁的运用: 洗脸 刷牙 吃早饭 看电视 出门 串行: import scala.concurrent.{Await, Future} import scala.util.{Fail ...
- QQ第三方授权登录OAuth2.0实现(Java)
准备材料 1.已经备案好的域名 2.服务器(域名和服务器为统一主体或域名已接入服务器) 3.QQ号 4.开发流程:https://wiki.connect.qq.com/%E5%87%86%E5%A4 ...
- node与mysql的相互使用————node+mysql
node与mysql的相互使用----node+mysql 为什么选node???因为我是个前端. 为什么选mysql???因为成熟,稳定,听说容易学. 一.mysql数据库: mysql下载和使用我 ...
- Lab_0操作系统实验准备(全)
一.实验介绍 实验目的: 知识储备: 二.相关下载 1.下载镜像文件 这个镜像文件是vdi类型的,只能用visualbox下载 链接:https://pan.baidu.com/s/1L7WX6ju4 ...
- 【JZOJ4807】破解
Description 历经千辛万苦,ddddddpppppp 终于找到了IBN5100. dp 事先了解到SERN 共有T 个密码,每个密码是一个长度为N 的01 串,他要利用IBN5100 的特殊 ...
- BS结构的一个注册用户的功能
注册用户功能 学了Java一段时间,就想折腾折腾,就做了一个注册的功能,用HTML写了一个网页上的比较简陋的界面,用Java做了一个后台简陋的服务器处理数据,最后将数据存储到数据库中. 注册界面 ...
- TCP方式的传输
TCP 客户端 先创建socket对象建立tcp客户端,明确服务端的地址和端口,必须与服务端对应,要不然对方收不到消息,就像快递填错了送货地址. Socket s = new Socket(" ...