1、在目标服务器上搭建FTP服务器

搭建方式有多种大家可以自行选择,例如使用Serv-U或者FTPServer.exe;这里我以FTPServer.exe为例搭建;在目标服务器(这里对应的IP是10.8.66.22)上运行FTPServer.exe并按照下图设置:

2、项目确保导入相应jar包:

apache的commons-net包:

maven项目导入下面的依赖即可:

        <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>

3、编写FTP工具类:

新建类名为FTPUtils的class,并将下面所有的代码黏贴进去:

package com.yxjr.mytest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; import com.yxjr.common.utils.UUIDUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply; /**
* FTP服务器工具类
*/
public class FTPUtils { /**
* 上传文件至FTP服务器
*
* @param url 服务器IP地址
* @param port 服务器端口
* @param userName 用户登录名
* @param password 用户登录密码
* @param storePath 服务器文件存储路径
* @param fileName 服务器文件存储名称
* @param is 文件输入流
* @return <b>true</b>:上传成功
* <br/>
* <b>false</b>:上传失败
*/
public static boolean storeFile(String url, int port, String userName, String password, String storePath, String fileName, InputStream is) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
// 连接至服务器,端口默认为21时,可直接通过URL连接
ftp.connect(url, port);
// 登录服务器
ftp.login(userName, password);
// 判断返回码是否合法
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
// 不合法时断开连接
ftp.disconnect();
// 结束程序
return result;
}
// 判断ftp目录是否存在,如果不存在则创建目录,包括创建多级目录
String s = "/" + storePath;
String[] dirs = s.split("/");
ftp.changeWorkingDirectory("/");
//按顺序检查目录是否存在,不存在则创建目录
for (int i = 1; dirs != null && i < dirs.length; i++) {
if (!ftp.changeWorkingDirectory(dirs[i])) {
if (ftp.makeDirectory(dirs[i])) {
if (!ftp.changeWorkingDirectory(dirs[i])) {
return false;
}
} else {
return false;
}
}
}
// 设置文件操作目录
ftp.changeWorkingDirectory(storePath);
// 设置文件类型,二进制
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// 设置缓冲区大小
ftp.setBufferSize(3072);
// 上传文件
result = ftp.storeFile(fileName, is);
// 关闭输入流
is.close();
// 登出服务器
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 判断输入流是否存在
if (null != is) {
// 关闭输入流
is.close();
}
// 判断连接是否存在
if (ftp.isConnected()) {
// 断开连接
ftp.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
} /**
* 从FTP服务器下载文件至本地
*
* @param url 服务器IP地址
* @param port 服务器端口
* @param userName 用户登录名
* @param password 用户登录密码
* @param remotePath 服务器文件存储路径
* @param fileName 服务器文件存储名称
* @param localPath 本地文件存储路径
* @return <b>true</b>:下载成功
* <br/>
* <b>false</b>:下载失败
*/
public static boolean retrieveFile(String url, int port, String userName, String password, String remotePath, String fileName, String localPath) {
boolean result = false;
FTPClient ftp = new FTPClient();
OutputStream os = null;
try {
// 连接至服务器,端口默认为21时,可直接通过URL连接
ftp.connect(url, port);
// 登录服务器
ftp.login(userName, password);
// 判断返回码是否合法
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
// 不合法时断开连接
ftp.disconnect();
// 结束程序
return result;
}
// 设置文件操作目录
ftp.changeWorkingDirectory(remotePath);
// 设置文件类型,二进制
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// 设置缓冲区大小
ftp.setBufferSize(3072);
// 设置字符编码
ftp.setControlEncoding("UTF-8");
// 构造本地文件对象
File localFile = new File(localPath + "/" + fileName);
// 获取文件操作目录下所有文件名称
String[] remoteNames = ftp.listNames();
// 循环比对文件名称,判断是否含有当前要下载的文件名
for (String remoteName : remoteNames) {
if (fileName.equals(remoteName)) {
result = true;
}
}
// 文件名称比对成功时,进入下载流程
if (result) {
// 构造文件输出流
os = new FileOutputStream(localFile);
// 下载文件
result = ftp.retrieveFile(fileName, os);
// 关闭输出流
os.close();
}
// 登出服务器
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 判断输出流是否存在
if (null != os) {
// 关闭输出流
os.close();
}
// 判断连接是否存在
if (ftp.isConnected()) {
// 断开连接
ftp.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
} /**
* 从FTP服务器删除文件
*
* @param url 服务器IP地址
* @param port 服务器端口
* @param userName 用户登录名
* @param password 用户登录密码
* @param remotePath 服务器文件存储路径
* @param fileName 服务器文件存储名称
* @return <b>true</b>:删除成功
* <br/>
* <b>false</b>:删除失败
*/
public static boolean deleteFile(String url, int port, String userName, String password, String remotePath, String fileName) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
// 连接至服务器,端口默认为21时,可直接通过URL连接
ftp.connect(url, port);
// 登录服务器
ftp.login(userName, password);
// 判断返回码是否合法
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
// 不合法时断开连接
ftp.disconnect();
// 结束程序
return result;
}
// 设置文件操作目录
ftp.changeWorkingDirectory(remotePath);
// 设置文件类型,二进制
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// 设置缓冲区大小
ftp.setBufferSize(3072);
// 设置字符编码
ftp.setControlEncoding("UTF-8");
// 获取文件操作目录下所有文件名称
String[] remoteNames = ftp.listNames();
// 循环比对文件名称,判断是否含有当前要下载的文件名
for (String remoteName : remoteNames) {
if (fileName.equals(remoteName)) {
result = true;
}
}
// 文件名称比对成功时,进入删除流程
if (result) {
// 删除文件
result = ftp.deleteFile(fileName);
}
// 登出服务器
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 判断连接是否存在
if (ftp.isConnected()) {
// 断开连接
ftp.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
} public static void main(String[] args) throws FileNotFoundException {
try {
FileInputStream fis = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\太行后台socket发送工具1.txt"));
System.out.println(storeFile("10.8.66.22", 21, "admin", "1", "D:\\FTP\\test", UUIDUtils.randomUUID() + ".txt", fis)); // File file = new File("D:\\upload\\20191217070411_start.txt");
// InputStream is = new FileInputStream(file);
// System.out.println(storeFile("10.8.66.22", 21, "admin", "1", "D:\\FTP\\test", "2.txt", is));
// System.out.println(retrieveFile("10.8.66.22", 21, "admin", "1", "D:\\FTP\\test", "2.txt", "D:\\upload"));
// System.out.println(deleteFile("10.8.66.22", 21, "admin", "1", "D:\\FTP\\test", "2.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} } }

上面的工具类定义了三个方法,分别支持上传文件,下载文件,删除FTP服务器上的文件,可根据需求自行调用;

最新文章

  1. Android开发之Activity的生命周期以及加载模式
  2. Android 布局中 如何使控件居中
  3. MySQL Workbench “Error Code: 1175” 的解决方法
  4. 转载文章----IL反编译利器——Ildasm.exe和Reflector.exe:
  5. sdut 2609 A-Number and B-Number
  6. Window.ActiveXObject的用法 以及如何判断浏览器的类型
  7. jsp页面转发到servlet
  8. 本地windows主机无法访问虚拟机里主机解决办法
  9. AndroidUI 视图动画-移动动画效果 (TranslateAnimation)
  10. ionic入门之基本布局
  11. mvc+EF比较好的框架
  12. 学号:201521123116 《java程序设计》第一周学习总结
  13. 通过Long类型的出生日期算年龄
  14. mysql批量修改列名为小写
  15. js--------1.时间
  16. 为什么HTML使用&lt;!DOCTYPE HTML&gt;
  17. 解读NoSQL数据库的四大家族
  18. day11-元组与字典
  19. 基于WebQQ3.0协议写一个QQ机器人
  20. [整理]定义但未初始化赋值的局部变量与OXCCCCCCCC

热门文章

  1. 2.原子变量 CAS算法
  2. Java基础加强-类加载器
  3. 自定义flask转换器
  4. linux分析工具之top命令详解
  5. 好用的redis客户端和Mongo客户端推荐
  6. Java abstract类的基本使用 和 [abstract类实现]打印1000以内的所有素数并输出时间
  7. ZZNU-oj-2141:2333--【O(N)求一个数字串能整除3的连续子串的个数,前缀和数组+对3取余组合数找规律】
  8. 三种方法给Vmware虚拟机占用空间清理瘦身
  9. Oracle自动化安装脚本-part02-亲试ok
  10. Python+request+ smtplib 测试结果html报告邮件发送(上)《五》