提交 c66e2342 编写于 作者: 1 1537639
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("-----------------------应用关闭------------------------");
}
}
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("-----------------------应用关闭------------------------");
}
}
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.
先完成此消息的编辑!
想要评论请 注册