//下载ftp指定文件夹下所有文件
public void downLoadAll(String ftpPath, String localPath) {
FTPClient ftpClient = new FTPClient();
try {
ftpPath = separatorHandle(ftpPath);
localPath = separatorHandle(localPath);
createPath(localPath);
ftpClient.setConnectTimeout(90000);
ftpClient.connect(ftpIp, ftpPort);
ftpClient.enterLocalPassiveMode();
if (ftpClient.login(ftpName, ftpPassword)) {
downFileOrDir(ftpPath, localPath, ftpClient);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (ftpClient.isConnected()) {
ftpClient.logout();
ftpClient.disconnect();
}
} catch (Exception e) {
}
}
}
/**
* FTP下载目录结构并且包括目录内文件
*/
private void downFileOrDir(String ftpPath, String localPath, FTPClient ftpClient) throws Exception {
File temp = new File(localPath);
Date date = new Date();
String now = DateUtils.formatDate(date, "yyyy-MM-dd");
if (!temp.exists()) {
temp.mkdirs();
}
FTPFile[] allFile = ftpClient.listFiles(ftpPath);
for (int i = 0; i < allFile.length; i++) {
File localfile = new File(localPath + File.separator + allFile[i].getName());
if (!localfile.exists()) {
localfile.mkdirs();// 创建文件夹
FTPFile[] ftpfiles = ftpClient.listFiles(ftpPath + allFile[i].getName(),
new MyFTPFileFilter("csv", ""));
if (ftpfiles != null && ftpfiles.length > 0) {
for (FTPFile ftpFile : ftpfiles) {
downloadingFile(ftpClient,
localPath + File.separator + allFile[i].getName() + File.separator + ftpFile.getName(),
ftpPath + allFile[i].getName() + File.separator + ftpFile.getName());
ftpClient.changeWorkingDirectory(ftpPath + allFile[i].getName());
ftpClient.dele(ftpFile.getName());
}
} else {
logger.info(ftpPath + ": no match file");
}
}
// 如果文件夹名称和当前日期相同则不删除
if (!now.equals(allFile[i].getName())) {
ftpClient.changeWorkingDirectory(ftpPath);
ftpClient.removeDirectory(allFile[i].getName());
}
}
}
private void downloadingFile(FTPClient ftpClient, String localFile, String remoteFile) throws Exception {
File file = new File(localFile);
if (file.exists()) {
file.delete();
}
FileOutputStream fos = null;
try {
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
fos = new FileOutputStream(localFile);
ftpClient.retrieveFile(remoteFile, fos);
fos.flush();
} catch (Exception e) {
throw e;
} finally {
if (fos != null) {
fos.close();
}
}
}
//上传ftp指定文件夹下所有文件
public void upLoadAll(String localPath, String ftpPath) {
FTPClient ftpClient = new FTPClient();
try {
ftpPath = separatorHandle(ftpPath);
localPath = separatorHandle(localPath);
createPath(localPath);
ftpClient.setConnectTimeout(90000);
ftpClient.connect(ftpIp, ftpPort);
ftpClient.enterLocalPassiveMode();
if (ftpClient.login(ftpName, ftpPassword)) {
uploadFileOrDir(localPath, ftpPath, ftpClient);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (ftpClient.isConnected()) {
ftpClient.logout();
ftpClient.disconnect();
}
} catch (Exception e) {
}
}
}
/**
* 上传ftp并删除本地文件
*/
public void uploadFileOrDir(String localPath, String addatasync, FTPClient ftpClient) throws Exception {
// 上传文件
addatasync = separatorHandle(addatasync);
localPath = separatorHandle(localPath);
File directory = new File(localPath);
File[] files = directory.listFiles();
if (files != null && files.length > 0) {
for (File file : files) {
String filename = file.getName();
ftpClient.changeWorkingDirectory(addatasync);
ftpClient.makeDirectory(filename);
File seDirectory = new File(localPath + filename);
File[] seFiles = seDirectory.listFiles();
for (File seFile : seFiles) {
ftpClient.changeWorkingDirectory(addatasync + filename);
uploadingFile(separatorHandle(addatasync + filename) + seFile.getName(),
separatorHandle(localPath + filename )+ seFile.getName(),ftpClient);
}
}
}
// 删除临时所有文件
deleteDir(directory);
File temp = new File(localPath);
if (!temp.exists()) {
temp.mkdirs();
}
}
private void deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
// 递归删除目录中的子目录下
for (int i = 0; i < children.length; i++) {
deleteDir(new File(dir, children[i]));
}
}
dir.delete();
}
private void uploadingFile(String remoteFile, String localfile, FTPClient ftpClient) throws Exception {
FileInputStream fis = null;
try {
// 设置PassiveMode传输
ftpClient.enterLocalPassiveMode();
// 设置以二进制流的方式传输
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.deleteFile(remoteFile);
ftpClient.mdtm(remoteFile);
ftpClient.setControlEncoding("UTF-8");
fis = new FileInputStream(localfile);
ftpClient.storeFile(remoteFile, fis);
} catch (Exception e) {
throw e;
} finally {
if (fis != null) {
fis.close();
}
}
}
public String separatorHandle(String str) {
if (!str.endsWith("/")) {
str = str + "/";
}
return str;
}