import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
FTPClient ftp = new FTPClient();
try {
ftp.connect(ip);
ftp.login(ftpName, ftpPassWord);
//localUrl为本地路径,ftpUrl为FTP的目的路径
boolean upload = uploadAllFileByFTP(ftp, localUrl, ftpUrl);
if (!upload) {
log.error("上传 " + ip + " :" + localUrl + " error.");
map.put(ip, false);
}
} catch (IOException e) {
log.info(ip + ":FTP连接出错,请检查用户名密码,FTP是否开通.", e);
map.put(ip, false);
} finally {
try {
ftp.disconnect();
} catch (IOException e) {
log.error("FTP关闭error.", e);
}
}
log.info("上传 " + ip + " :" + localUrl + " end.");
/**
* localUrl:本地路径(如:/aa/uploadData)
* ftpUrl:ftp路径(如:/bb/data)
* 上传结果:bb/data/uploadData
*/
private boolean uploadAllFileByFTP(FTPClient ftp, String localUrl, String ftpUrl) {
File srcFile = new File(localUrl);// 本地路径
if (srcFile.isDirectory()) {//判断是否存在这个目录
try {
ftpUrl = ftpUrl + "/" + srcFile.getName();
ftp.makeDirectory(ftpUrl);
} catch (IOException e) {
log.error("上传error,请检查ftp目录是否存在。", e);
return false;
}
File[] srcChFiles = srcFile.listFiles();
for (File srcChFile : srcChFiles != null ? srcChFiles : new File[0]) {
//getAbsolutePath()为获取文件的绝对路径
uploadAllFileByFTP(ftp, srcChFile.getAbsolutePath(), ftpUrl);
}
} else {
FileInputStream fis = null;
try {
fis = new FileInputStream(srcFile);
//将工作路径切换到文件要上传的FTP路径
boolean isChagedDir = ftp.changeWorkingDirectory(ftpUrl);
if (!isChagedDir) {
log.info("上传error,FTP切换目录出错,请检查FTP开通的路径。");
return false;
}
//设置1M缓存
ftp.setBufferSize(1024);
//设置编码为UTF-8
ftp.setControlEncoding("UTF-8");
// 设置文件类型(二进制)
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
/*这句话较重要,没有这句话,有可能无法上传文件是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。*/
ftp.enterLocalPassiveMode();
boolean isSuccess = ftp.storeFile(srcFile.getName(), fis);
if (!isSuccess) {
log.info("上传" + srcFile.getAbsoluteFile() + "error,请检查是否有文件读写权限。");
}
} catch (Exception e) {
log.error("ftpUploadAllFile error!", e);
return false;
} finally {
IOUtils.closeQuietly(fis);
}
}
return true;
}
import org.apache.commons.net.ftp.FTPFile;
FTPClient ftp = new FTPClient();
try {
ftp.connect(ip);
ftp.login(ftpName, ftpPassWord);
//localUrl为本地路径,ftpUrl为FTP的目的路径
boolean upload = uploadAllFileByFTP(ftp, localUrl, ftpUrl);
if (!upload) {
log.error("上传 " + ip + " :" + localUrl + " error.");
map.put(ip, false);
}
} catch (IOException e) {
log.info(ip + ":FTP连接出错,请检查用户名密码,FTP是否开通.", e);
map.put(ip, false);
} finally {
try {
ftp.disconnect();
} catch (IOException e) {
log.error("FTP关闭error.", e);
}
}
log.info("上传 " + ip + " :" + localUrl + " end.");
/**
* localUrl:本地路径(如:/aa/uploadData)
* ftpUrl:ftp路径(如:/bb/data)
* 上传结果:bb/data/uploadData
*/
private boolean uploadAllFileByFTP(FTPClient ftp, String localUrl, String ftpUrl) {
File srcFile = new File(localUrl);// 本地路径
if (srcFile.isDirectory()) {//判断是否存在这个目录
try {
ftpUrl = ftpUrl + "/" + srcFile.getName();
ftp.makeDirectory(ftpUrl);
} catch (IOException e) {
log.error("上传error,请检查ftp目录是否存在。", e);
return false;
}
File[] srcChFiles = srcFile.listFiles();
for (File srcChFile : srcChFiles != null ? srcChFiles : new File[0]) {
//getAbsolutePath()为获取文件的绝对路径
uploadAllFileByFTP(ftp, srcChFile.getAbsolutePath(), ftpUrl);
}
} else {
FileInputStream fis = null;
try {
fis = new FileInputStream(srcFile);
//将工作路径切换到文件要上传的FTP路径
boolean isChagedDir = ftp.changeWorkingDirectory(ftpUrl);
if (!isChagedDir) {
log.info("上传error,FTP切换目录出错,请检查FTP开通的路径。");
return false;
}
//设置1M缓存
ftp.setBufferSize(1024);
//设置编码为UTF-8
ftp.setControlEncoding("UTF-8");
// 设置文件类型(二进制)
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
/*这句话较重要,没有这句话,有可能无法上传文件是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。*/
ftp.enterLocalPassiveMode();
boolean isSuccess = ftp.storeFile(srcFile.getName(), fis);
if (!isSuccess) {
log.info("上传" + srcFile.getAbsoluteFile() + "error,请检查是否有文件读写权限。");
}
} catch (Exception e) {
log.error("ftpUploadAllFile error!", e);
return false;
} finally {
IOUtils.closeQuietly(fis);
}
}
return true;
}