package com.cmsz.core;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
public class FTPTest {
public static void main(String[] args) {
FTPClient ftpclient = new FTPClient();
//传输的字符编码(防乱码)
ftpclient.setControlEncoding("UTF-8");
//超时时间(防止FTP僵死)
ftpclient.setConnectTimeout(1000 * 60);
ftpclient.setDataTimeout(1000 * 60);
ftpclient.setDefaultTimeout(1000 * 60);
//工作流的大小
ftpclient.setBufferSize(1024 * 4);
//主被动模式(应对FTP服务器的相关安全设置)
//ftpclient.enterLocalPassiveMode();
ftpclient.enterLocalActiveMode();
FTPFile[] ftpFiles = null;
try {
//设置连接ip
ftpclient.connect("192.168.59.127");
//连接是否正常
if (ftpclient.isConnected()) {
//使用用户名和密码进行登录
if (ftpclient.login("admin", "Rebt@729")) {
//判断FTP连接是否可用、源码中判断ReplyCode值为(reply >= 200) && (reply < 300)为可用,非单纯200!
if(FTPReply.isPositiveCompletion(ftpclient.getReplyCode())){
System.out.println("FTP登录成功,FTP IP:" + ftpclient.getRemoteAddress());
//设置文件类型
try {
//默认为ASCII(value:0),此处设置为2进制
System.out.println("设置文件类型为:"+ftpclient.BINARY_FILE_TYPE);
ftpclient.setFileType(ftpclient.BINARY_FILE_TYPE);
} catch (IOException e1) {
e1.printStackTrace();
}
System.out.println("当前工作目录为:" + ftpclient.printWorkingDirectory());
//设置工作目录
ftpclient.changeWorkingDirectory("/usr/admin/aBit/ab");
System.out.println("设置工作目录为:" + ftpclient.printWorkingDirectory());
ftpFiles = ftpclient.listFiles();
System.out.println("获得文件个数为:" + ftpFiles.length);
OutputStream os = null;
String name = null;
int ftpleng = ftpFiles.length;
/*
* 下面的代码分别是批量下载、删除、上传的代码
* 其实为了更好的容错和符合逻辑,下载FTP文件和删除FTP源文件应该放在一个事务里面执行,本代码只是实例,方便看清楚
* 同理、上传文件到FTP和删除本地源文件也应该放在一个事务中执行
*/
//循环下载文件
for (int i = 0; i < ftpleng; i++) {
name = ftpFiles[i].getName();
System.out.println("下载FTP文件:" + name);
os = new FileOutputStream("E:\\abc\\" + name);
boolean ret = ftpclient.retrieveFile(name, os);
if(ret){
System.out.println("下载FTP文件:"+name+"成功,完成度"+(i+1)+"/"+ftpleng);
}
}
//删除FTP源文件
String dename = null;
for(int y = 0; y < ftpleng; y++){
dename = ftpFiles[y].getName();
System.out.println("删除FTP文件:"+dename);
boolean del = ftpclient.deleteFile(dename);
if(del){
System.out.println("删除FTP文件:"+dename+"成功,完成度"+(y+1)+"/"+ftpleng);
}
}
//上传文件到FTP服务器
//扫描本地文件
File file = new File("E:\\abc");
// 获取当前目录下的所有文件
File[] fs = file.listFiles();
FileInputStream fis = null;
int x = 1;
String name2 = null;
int ftpsize = fs.length;
for (File file2 : fs) {
name2 = file2.getName();
System.out.println("上传本地文件:"+name2);
fis = new FileInputStream("E:\\abc\\"+name2);
boolean sto = ftpclient.storeFile(name2, fis);
if(sto){
System.out.println("上传本地文件:"+name2+"成功,完成度"+x+"/"+ftpsize);
}
//比较本地文件与FTP文件的大小
//1.本地文件
long localfile = file2.length();
//2.FTP文件
FTPFile[] ftpfile = ftpclient.listFiles(name2);
long ftpf = ftpfile[0].getSize();
if(localfile == ftpf){
System.out.println("本地文件与FTP文件大小一致、上传正常......"+ftpf);
System.out.println("删除本地文件:"+name2);
file2.delete();
}else{
System.out.println("本地文件与FTP文件大小不一,localFile:"+localfile+",FTP文件大小:"+ftpf);
}
x++;
}
}
} else {
System.out.println("FTP登录失败,FTP IP:" + ftpclient.getRemoteAddress());
}
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
ftpclient.logout();
} catch (IOException e) {
System.out.println("尝试登出FTP失败");
e.printStackTrace();
}
try {
ftpclient.disconnect();
} catch (IOException e) {
System.out.println("尝试断开FTP连接失败");
e.printStackTrace();
}
}
}
}
FTP上传下载以及相关注意点
最新推荐文章于 2021-03-20 01:04:44 发布