JAVA通过FTP方式向远程服务器或者客户端上传、下载文件,以及删除FTP服务器上的文件
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服务器上的文件,可根据需求自行调用;
JAVA通过FTP方式向远程服务器或者客户端上传、下载文件,以及删除FTP服务器上的文件的更多相关文章
- 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)
前言 最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有两种. 第一种是单例模式的类. 第二种是另外定义一个Service,直接通过Service来实现ftp的上 ...
- MVC图片上传、浏览、删除 ASP.NET MVC之文件上传【一】(八) ASP.NET MVC 图片上传到服务器
MVC图片上传.浏览.删除 1.存储配置信息 在web.config中,添加配置信息节点 <appSettings> <add key="UploadPath" ...
- Linux shell:FTP(文件传输协议)上传下载命令
SecureCRT通过ftp将nmon上传,建立一个目录,用命令上传文件.[命令见下面] 或通过UE.SSH上传/下载,使用sftp建立链接. [通过cmd进入ftp服务器]先假设有一FTP服务器,F ...
- 【FTP】使用org.apache.commons.net.ftp.FTPClient 实现FTP的上传下载
在此之前,在项目中加上FTP的架包 第一步:配置FTP服务器的相关配置 FtpConfig.java 实体类(配置类) package com.sxd.ftp; public class FtpCo ...
- C# -- FTP上传下载
C# -- FTP上传下载 1. C#实现FTP下载 private static void TestFtpDownloadFile(string strFtpPath, string strFile ...
- Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】
[]如何区分是需要使用SFTP还是FTP? []我觉得: 1.看是否已知私钥. SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道 ...
- JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)
package com.why.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputSt ...
- Java实现FTP批量大文件上传下载篇1
本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...
- Java.ftp上传下载
1:jar的maven的引用: 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...
随机推荐
- 十年阿里顶级架构师教你怎么使用Java来搭建微服务
微服务背后的大理念是将大型.复杂且历时长久的应用在架构上设计为内聚的服务,这些服务能够随着时间的流逝而演化.本文主要介绍了利用 Java 生态系统构建微服务的多种方法,并分析了每种方法的利弊. 快速预 ...
- 【Day4】5.Request对象之Http Post请求案例分析
import urllib.parse as up import urllib.request as ur import json word = input('请输入要翻译的中文') data = { ...
- 深度学习之卷积神经网络CNN及tensorflow代码实例
深度学习之卷积神经网络CNN及tensorflow代码实例 什么是卷积? 卷积的定义 从数学上讲,卷积就是一种运算,是我们学习高等数学之后,新接触的一种运算,因为涉及到积分.级数,所以看起来觉得很复杂 ...
- 01 Windows编程——Hello World
源码 #include "stdafx.h" #include<Windows.h> int WINAPI WinMain(HINSTANCE hInst,HINSTA ...
- (14)占位符%和format
# 在介绍占位符之前,这里先介绍下索引,索引可以方便的帮我们拿到容器内的数据 # 索引可以简单的理解为一个有序的标记,我们把容器里的元素每一个都编上一个编号 # 凡是有序的容器类型数据,都可以通过索引 ...
- PrintWriter返回乱码的分析及解决
用response得到输出流,即response.getOuptStream(); 返回值为ServletOutputStream 对象,即JSP的out对象,要么用response得到输出对象Pri ...
- jade继承
代码的复用是jade非常突出的一个设计目标,jade不仅仅通过mixin来复用代码,他在文件的组织能力上也非常突出,说白了,就是继承和包涵 block定义的方式和调用的方式 block desc ...
- 标准库类型之map
使用map得包含map类所在的头文件#include <map> 定义一个map对象:map<string, int> mapTest;//用string作为索引,存储int对 ...
- Lua 学习之基础篇二<Lua 数据类型以及函数库 汇总>
引言 前面讲了运算符,这里主要对Lua的数据处理相关的数据类型和函数库进行总结归纳,后面会再接着单独分开讲解具体使用. 首先因为Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值. 值可以存储 ...
- Task.Run 和 Task.Factory.StartNew 区别
Task.Run 是在 dotnet framework 4.5 之后才可以使用, Task.Factory.StartNew 可以使用比 Task.Run 更多的参数,可以做到更多的定制. 可以认为 ...