Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qq_51543278
FTPsystem
提交
c66e2342
F
FTPsystem
项目概览
qq_51543278
/
FTPsystem
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
3
列表
看板
标记
里程碑
合并请求
1
DevOps
流水线
流水线任务
计划
Wiki
12
Wiki
分析
仓库
DevOps
项目成员
Pages
F
FTPsystem
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
3
Issue
3
列表
看板
标记
里程碑
合并请求
1
合并请求
1
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
12
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c66e2342
编写于
10月 15, 2022
作者:
1
1537639
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' of
https://gitcode.net/qq_51543278/ftpsystem
上级
b30bfb9f
d8b37ce9
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
318 addition
and
0 deletion
+318
-0
src/ftp/Connect.java
src/ftp/Connect.java
+99
-0
src/ftp/DeleteFiles.java
src/ftp/DeleteFiles.java
+90
-0
src/ftp/Download.java
src/ftp/Download.java
+129
-0
未找到文件。
src/ftp/Connect.java
浏览文件 @
c66e2342
package
ftp
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.net.ftp.FTPClient
;
import
org.apache.commons.net.ftp.FTPReply
;
import
java.io.IOException
;
public
class
Connect
{
//连接,需要用户名,密码(前两个有可能不需要),主机IP,端口
//连接FTP服务
public
static
FTPClient
connectFtpServer
(
String
addr
,
int
port
,
String
username
,
String
password
,
String
controlEncoding
)
{
//FTP连接 addr服务器IP地址(172.17.2.15),port服务器端口号(21),username用户名 User,password密码 123456,controlEncoding传输编码
//
FTPClient
ftpClient
=
new
FTPClient
();
//生成客户端对象
try
{
/**设置文件传输的编码*/
ftpClient
.
setControlEncoding
(
controlEncoding
);
//UTF-8,GBK
/**连接 FTP 服务器
* 如果连接失败,则此时抛出异常,如ftp服务器服务关闭时,抛出异常:
* java.net.ConnectException: Connection refused: connect*/
ftpClient
.
connect
(
addr
,
port
);
//服务器与端口连接
/**登录 FTP 服务器
* 1)如果传入的账号为空,则使用匿名登录,此时账号使用 "Anonymous",密码为空即可*/
if
(
StringUtils
.
isBlank
(
username
))
{
ftpClient
.
login
(
"Anonymous"
,
""
);
}
else
{
ftpClient
.
login
(
username
,
password
);
}
//? 禁用匿名登录
/** 设置传输的文件类型
* BINARY_FILE_TYPE:二进制文件类型
* ASCII_FILE_TYPE:ASCII传输方式,这是默认的方式
* ....
*/
ftpClient
.
setFileType
(
FTPClient
.
BINARY_FILE_TYPE
);
//设置二进制文件格式
/**
* 确认应答状态码是否正确完成响应
* 凡是 2开头的 isPositiveCompletion 都会返回 true,因为它底层判断是:
* return (reply >= 200 && reply < 300);
*/
int
reply
=
ftpClient
.
getReplyCode
();
if
(!
FTPReply
.
isPositiveCompletion
(
reply
))
{
/**
* 如果 FTP 服务器响应错误 中断传输、断开连接
* abort:中断文件正在进行的文件传输,成功时返回 true,否则返回 false
* disconnect:断开与服务器的连接,并恢复默认参数值
*/
ftpClient
.
abort
();
ftpClient
.
disconnect
();
//? 返回响应错误? 中断
}
else
{
//? 不作变化? 返回连接成功?
System
.
out
.
println
(
"OK"
);
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
System
.
out
.
println
(
">>>>>FTP服务器连接登录失败,请检查连接参数是否正确,或者网络是否通畅*********"
);
//页面?
}
return
ftpClient
;
}
public
static
FTPClient
closeFTPConnect
(
FTPClient
ftpClient
)
{
try
{
if
(
ftpClient
!=
null
&&
ftpClient
.
isConnected
())
{
ftpClient
.
abort
();
ftpClient
.
disconnect
();
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
ftpClient
;
}
public
static
void
main
(
String
[]
args
)
throws
Exception
{
//UI.feedback("-----------------------应用启动------------------------");
//UI.input1-5 gei addr port username;
FTPClient
ftpClient
=
Connect
.
connectFtpServer
(
"172.17.2.15"
,
21
,
"User"
,
"123456"
,
"gbk"
);
if
(!
ftpClient
.
isConnected
())
{
System
.
out
.
println
(
"FTP 连接是否成功:否"
);
}
//System.out.println("FTP 连接是否成功:" + ftpClient.isConnected());
//return this._socket_ == null ? false : this._socket_.isConnected();
//
if
(!
ftpClient
.
isAvailable
())
{
System
.
out
.
println
(
"FTP 连接是否有效:否"
);
}
//System.out.println("FTP 连接是否有效:" + ftpClient.isAvailable());
closeFTPConnect
(
ftpClient
);
//UI
System
.
out
.
println
(
"-----------------------应用关闭------------------------"
);
}
}
src/ftp/DeleteFiles.java
浏览文件 @
c66e2342
package
ftp
;
import
org.apache.commons.net.ftp.FTPClient
;
import
org.apache.commons.net.ftp.FTPFile
;
import
java.io.IOException
;
/**
* 删除服务器的文件
*
* @param ftpClient 连接成功且有效的 FTP客户端
* @param deleteFiles 待删除的文件或者目录,为目录时,会逐个删除,
* 路径必须是绝对路径,如 "/1.png"、"/video/3.mp4"、"/images/2018"
* "/" 表示用户根目录,则删除所有内容
*/
public
class
DeleteFiles
{
public
static
void
deleteServerFiles
(
FTPClient
ftpClient
,
String
deleteFiles
)
{
/**如果 FTP 连接已经关闭,或者连接无效,则直接返回*/
if
(!
ftpClient
.
isConnected
()
||
!
ftpClient
.
isAvailable
())
{
System
.
out
.
println
(
">>>>>FTP服务器连接已经关闭或者连接无效*****放弃文件上传****"
);
return
;
}
try
{
/** 尝试改变当前工作目录到 deleteFiles
* 1)changeWorkingDirectory:变更FTPClient当前工作目录,变更成功返回true,否则失败返回false
* 2)如果变更工作目录成功,则表示 deleteFiles 为服务器已经存在的目录
* 3)否则变更失败,则认为 deleteFiles 是文件,是文件时则直接删除
*/
boolean
changeFlag
=
ftpClient
.
changeWorkingDirectory
(
deleteFiles
);
//调用net包的改变工作目录;boolean(reply(250,300)不超时,return true;)
if
(
changeFlag
)
{
/**当被删除的是目录时*/
FTPFile
[]
ftpFiles
=
ftpClient
.
listFiles
();
//生成ftp文件数组存放客户端的文件列表
for
(
FTPFile
ftpFile
:
ftpFiles
)
{
//遍历
System
.
out
.
println
(
"----------------::::"
+
ftpClient
.
printWorkingDirectory
());
//UI 返回工作目录,感觉可以删除。
if
(
ftpFile
.
isFile
())
{
boolean
deleteFlag
=
ftpClient
.
deleteFile
(
ftpFile
.
getName
());
if
(
deleteFlag
)
{
System
.
out
.
println
(
">>>>>删除服务器文件成功****"
+
ftpFile
.
getName
());
//UI 删除多个;
}
else
{
System
.
out
.
println
(
">>>>>删除服务器文件失败****"
+
ftpFile
.
getName
());
//UI
}
}
else
{
/**printWorkingDirectory:获取 FTPClient 客户端当前工作目录
* 然后开始迭代删除子目录
*/
String
workingDirectory
=
ftpClient
.
printWorkingDirectory
();
deleteServerFiles
(
ftpClient
,
workingDirectory
+
"/"
+
ftpFile
.
getName
());
}
}
/**printWorkingDirectory:获取 FTPClient 客户端当前工作目录
* removeDirectory:删除FTP服务端的空目录,注意如果目录下存在子文件或者子目录,则删除失败
* 运行到这里表示目录下的内容已经删除完毕,此时再删除当前的为空的目录,同时将工作目录移动到上移层级
* */
String
workingDirectory
=
ftpClient
.
printWorkingDirectory
();
ftpClient
.
removeDirectory
(
workingDirectory
);
ftpClient
.
changeToParentDirectory
();
}
else
{
/**deleteFile:删除FTP服务器上的文件
* 1)只用于删除文件而不是目录,删除成功时,返回 true
* 2)删除目录时无效,方法返回 false
* 3)待删除文件不存在时,删除失败,返回 false
* */
boolean
deleteFlag
=
ftpClient
.
deleteFile
(
deleteFiles
);
if
(
deleteFlag
)
{
System
.
out
.
println
(
">>>>>删除服务器文件成功****"
+
deleteFiles
);
//UI
}
else
{
System
.
out
.
println
(
">>>>>删除服务器文件失败****"
+
deleteFiles
);
//UI
}
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
public
static
void
main
(
String
[]
args
)
throws
Exception
{
//System.out.println("-----------------------应用启动------------------------");
//FTPClient ftpClient = Connect.connectFtpServer("192.168.1.20", 21, "ftpChina", "ftpChina123456", "gbk");
deleteServerFiles
(
ftpClient
,
"/datas"
);
Connect
.
closeFTPConnect
(
ftpClient
);
System
.
out
.
println
(
"-----------------------应用关闭------------------------"
);
}
}
src/ftp/Download.java
浏览文件 @
c66e2342
package
ftp
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.net.ftp.FTPClient
;
import
org.apache.commons.net.ftp.FTPFile
;
import
java.io.File
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.io.OutputStream
;
import
java.util.ArrayList
;
import
java.util.List
;
public
class
Download
{
/**
* 遍历 FTP 服务器指定目录下的所有文件(包含子孙文件)
*
* @param ftpClient :连接成功有效的 FTP客户端连接
* @param remotePath :查询的 FTP 服务器目录,如果文件,则视为无效,使用绝对路径,如"/"、"/video"、"\\"、"\\video"
* @param relativePathList :返回查询结果,其中为服务器目录下的文件相对路径,如:\1.png、\docs\overview-tree.html 等
* @return
*/
public
static
List
<
String
>
loopServerPath
(
FTPClient
ftpClient
,
String
remotePath
,
List
<
String
>
relativePathList
)
{
/**如果 FTP 连接已经关闭,或者连接无效,则直接返回*/
if
(!
ftpClient
.
isConnected
()
||
!
ftpClient
.
isAvailable
())
{
UI
.
feedback
(
"ftp 连接已经关闭或者连接无效......"
);
//System.out.println("ftp 连接已经关闭或者连接无效......");
//UI
return
relativePathList
;
}
try
{
/**转移到FTP服务器根目录下的指定子目录
* 1)"/":表示用户的根目录,为空时表示不变更
* 2)参数必须是目录,当是文件时改变路径无效
* */
ftpClient
.
changeWorkingDirectory
(
remotePath
);
/** listFiles:获取FtpClient连接的当前下的一级文件列表(包括子目录)
* 1)FTPFile[] ftpFiles = ftpClient.listFiles("/docs/info");
* 获取服务器指定目录下的子文件列表(包括子目录),以 FTP 登录用户的根目录为基准,与 FTPClient 当前连接目录无关
* 2)FTPFile[] ftpFiles = ftpClient.listFiles("/docs/info/springmvc.txt");
* 获取服务器指定文件,此时如果文件存在时,则 FTPFile[] 大小为 1,就是此文件
* */
FTPFile
[]
ftpFiles
=
ftpClient
.
listFiles
();
if
(
ftpFiles
!=
null
&&
ftpFiles
.
length
>
0
)
{
for
(
FTPFile
ftpFile
:
ftpFiles
)
{
if
(
ftpFile
.
isFile
())
{
String
relativeRemotePath
=
remotePath
+
"\\"
+
ftpFile
.
getName
();
relativePathList
.
add
(
relativeRemotePath
);
}
else
{
loopServerPath
(
ftpClient
,
remotePath
+
"\\"
+
ftpFile
.
getName
(),
relativePathList
);
}
}
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
return
relativePathList
;
}
public
static
void
main
(
String
[]
args
)
throws
Exception
{
List
<
String
>
relativePathList
=
new
ArrayList
<>();
relativePathList
=
loopServerPath
(
ftpClient
,
"\\video"
,
relativePathList
);
for
(
String
relativePath
:
relativePathList
)
{
System
.
out
.
println
(
"准备下载的服务器文件:"
+
relativePath
);
downloadSingleFile
(
ftpClient
,
"E:\\gxg\\ftpDownload"
,
relativePath
);
}
/* downloadSingleFile(ftpClient, "E:\\gxg\\ftpDownload", "\\1.png");
downloadSingleFile(ftpClient, "E:\\gxg\\ftpDownload", "\\xml\\schedule.xml");*/
}
public
static
void
downloadSingleFile
(
FTPClient
ftpClient
,
String
absoluteLocalDirectory
,
String
filename
)
{
String
dir
;
String
relativeRemotePath
;
List
<
String
>
relativePathList
=
new
ArrayList
<>();
FTPFile
ftpFile
;
if
(!
ftpClient
.
isConnected
()
||
!
ftpClient
.
isAvailable
())
{
System
.
out
.
println
(
">>>>>FTP服务器连接已经关闭或者连接无效*********"
);
//UI
return
;
}
try
{
dir
=
ftpClient
.
printWorkingDirectory
();
relativeRemotePath
=
dir
+
"\\"
+
filename
;
ftpFile
=
ftpClient
.
}
catch
(
IOException
e
)
{
UI
.
feedback
(
"无法获取当前工作目录"
);
return
;
}
if
()
if
(
StringUtils
.
isBlank
(
absoluteLocalDirectory
)
||
StringUtils
.
isBlank
(
relativeRemotePath
))
{
System
.
out
.
println
(
">>>>>下载时遇到本地存储路径或者ftp服务器文件路径为空,放弃...*********"
);
return
;
}
try
{
FTPFile
[]
ftpFiles
=
ftpClient
.
listFiles
(
relativeRemotePath
);
if
(
ftpFiles
.
length
>=
1
)
{
ftpFile
=
ftpFiles
[
0
];
}
if
(
ftpFile
!=
null
&&
ftpFile
.
isFile
())
{
File
localFile
=
new
File
(
absoluteLocalDirectory
,
relativeRemotePath
);
if
(!
localFile
.
getParentFile
().
exists
())
{
localFile
.
getParentFile
().
mkdirs
();
}
OutputStream
outputStream
=
new
FileOutputStream
(
localFile
);
String
workDir
=
relativeRemotePath
.
substring
(
0
,
relativeRemotePath
.
lastIndexOf
(
"\\"
));
if
(
StringUtils
.
isBlank
(
workDir
))
{
workDir
=
"/"
;
}
ftpClient
.
changeWorkingDirectory
(
workDir
);
ftpClient
.
retrieveFile
(
ftpFile
.
getName
(),
outputStream
);
outputStream
.
flush
();
outputStream
.
close
();
System
.
out
.
println
(
">>>>>FTP服务器文件下载完毕*********"
+
ftpFile
.
getName
());
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
public
static
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录