週期性上傳檔案到ftp服務端指定路徑功能實現
阿新 • • 發佈:2019-01-28
程式的功能
該程式實現週期性的從本地指定路徑中獲取檔案及列表,上傳到指定的ftp伺服器路徑中,並在上傳完成後刪除本地路徑中的檔案。使用方法:把本文中java程式碼打包成ftpupload.jar,並新增jdk路徑後,執行run.bat檔案。
程式的檔案列表及功能描述
編號 | 檔名 | 檔案功能 |
1 | run.bat | 檔案啟動應用程式,執行以完成程式功能。 |
2 | config.properties | 描述了ftp伺服器的ip、使用者、密碼、遠端路徑、本地路徑、執行週期等引數。 |
3 | log4j.properties | 日誌記錄模組通用配置檔案。 |
4 | AppTask.java | 週期執行的任務,從本地獲取檔案列表,上傳到ftp指定目錄下,並刪除本地檔案。 |
5 | Scheduler.java | 主程式,建立定時器並啟動 |
6 | FilePara.java | 檔名引數物件,包含檔名、檔案絕對路徑等引數處理,在AppTask類中呼叫 |
7 | FtpParameters.java | ftp服務端引數類,呼叫ParaFileUtil從config.properties檔案中獲取引數並被AppTask使用 |
8 | FileUtil.java | 檔案操作類,實現了資料夾建立、刪除等操作 |
9 | FtpUtil.java | ftp伺服器操作類,實現ftp上檔案的上傳及下載 |
10 | ParaFileUtil.java | 引數檔案config.properties對應的工具類,用來讀取引數檔案 |
詳細程式的檔案內容如下
1.run.bat檔案
SET JAVA=jre6\bin\java.exe SET DEBUG=-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=2345 %JAVA% %DEBUG% -Xmx384m -classpath lib\commons-net-3.6.jar;lib\ftpupload.jar;lib\log4j.jar; sz.app.Scheduler
2.config.properties檔案
ip=127.0.0.1
port=21
user=czh
pwd=czh123
basePath=/abc
localPath=d:/abc
timeInterval=2
3.log4j.properties
# Configure logging for testing: optionally with log file
#可以設定級別:debug>info>error
#debug:可以顯式debug,info,error
#info:可以顯式info,error
#error:可以顯式error
log4j.rootLogger=debug,appender1
#log4j.rootLogger=info,appender1
#log4j.rootLogger=error,appender1
#輸出到控制檯
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#樣式為TTCCLayout
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
4.AppTask.java
package sz.app;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import sz.bean.FilePara;
import sz.bean.FtpParameters;
import sz.util.FileUtil;
import sz.util.FtpUtil;
public class AppTask extends java.util.TimerTask{
private static Logger logger = Logger.getLogger(AppTask.class);
@Override
public void run() {
logger.info("start task.");
new AppTask().doUpload();
logger.info("task complete.");
}
private void doUpload() {
FtpParameters ftpPara = new FtpParameters();
List<String> fileNames = new ArrayList<String>();
traverseFolder(ftpPara.getLocalPath(), fileNames);
for(String fileName:fileNames) {
FilePara filePara = new FilePara(fileName);
upload2ftp(filePara);
}
logger.info("start clear dir.");
FileUtil.clearDir(ftpPara.getLocalPath());
logger.info("start clear complete.");
}
private void upload2ftp(FilePara filePara) {
FtpParameters ftpPara = new FtpParameters();
InputStream inputStream;
try {
inputStream = new FileInputStream(new File(filePara.getPath()));
boolean result = FtpUtil.uploadFile(ftpPara.getIp(),
ftpPara.getPort(),
ftpPara.getUser(),
ftpPara.getPwd(),
ftpPara.getBasePath(),
"",
filePara.getFileName(),
inputStream);
if (!result) {
System.out.println("upload error! file:" + filePara.getPath());
logger.warn("upload error! file:" + filePara.getPath());
}
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
logger.error("upload error! file:" + filePara.getPath(), e);
}
}
private void traverseFolder(String path, List<String> fileNames) {
File file = new File(path);
if (file.exists()) {
File[] files = file.listFiles();
if (files.length == 0) {
return;
} else {
for (File file2 : files) {
if (file2.isDirectory()) {
logger.info("遍歷資料夾:" + file2.getAbsolutePath());
traverseFolder(file2.getAbsolutePath(), fileNames);
} else {
fileNames.add(file2.getAbsolutePath());
logger.info("找到檔案:" + file2.getAbsolutePath());
}
}
}
} else {
logger.warn("資料夾不存在:" + path);
}
}
}
5.Scheduler.java
package sz.app;
import java.util.Timer;
import sz.bean.FtpParameters;
public class Scheduler {
public static void main(String[] args){
FtpParameters ftpPara = new FtpParameters();
Timer timer = new Timer();
AppTask myTask1 = new AppTask();
timer.schedule(myTask1, 1000, ftpPara.getTimeInterval() * 1000 * 60);
}
}
6.FilePara.java
package sz.bean;
import java.io.File;
public class FilePara {
private String path;
private String fileName;
public void setPath(String path) {
this.path = path;
}
public String getPath() {
return path;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFileName() {
return fileName;
}
public FilePara(String fileAbsoluteName) {
File file = new File(fileAbsoluteName);
setPath(fileAbsoluteName);
setFileName(file.getName());
}
}
7.FtpParameters.java
package sz.bean;
import sz.util.ParaFileUtil;
public class FtpParameters {
private String ip;
private int port;
private String user;
private String pwd;
private String basePath;
private String localPath;
private int timeInterval;
public void setIp(String ip) {
this.ip = ip;
}
public String getIp() {
return ip;
}
public void setPort(String port) {
this.port = Integer.parseInt(port);
}
public int getPort() {
return port;
}
public void setUser(String user) {
this.user = user;
}
public String getUser() {
return user;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getPwd() {
return pwd;
}
public FtpParameters(){
setIp(ParaFileUtil.getPropertyValue("ip"));
setPort(ParaFileUtil.getPropertyValue("port"));
setUser(ParaFileUtil.getPropertyValue("user"));
setPwd(ParaFileUtil.getPropertyValue("pwd"));
setBasePath(ParaFileUtil.getPropertyValue("basePath"));
setLocalPath(ParaFileUtil.getPropertyValue("localPath"));
setTimeInterval(ParaFileUtil.getPropertyValue("timeInterval"));
}
public static void main(String[] args) {
FtpParameters ftpParameters = new FtpParameters();
System.out.println(ftpParameters.getBasePath());
}
public void setBasePath(String basePath) {
this.basePath = basePath;
}
public String getBasePath() {
return basePath;
}
public void setLocalPath(String localPath) {
this.localPath = localPath;
}
public String getLocalPath() {
return localPath;
}
public void setTimeInterval(String timeInterval) {
this.timeInterval = Integer.parseInt(timeInterval);
}
public int getTimeInterval() {
return timeInterval;
}
}
8.FileUtil.java
package sz.util;
import java.io.File;
import org.apache.log4j.Logger;
public class FileUtil {
private static Logger logger = Logger.getLogger(FileUtil.class);
public static boolean delete(String fileName) {
File file = new File(fileName);
if (!file.exists()) {
logger.warn("刪除檔案失敗:" + fileName + "不存在!");
System.out.println("刪除檔案失敗:" + fileName + "不存在!");
return false;
} else {
if (file.isFile())
return deleteFile(fileName);
else
return deleteDirectory(fileName);
}
}
/**
* 刪除單個檔案
*
* @param fileName
* 要刪除的檔案的檔名
* @return 單個檔案刪除成功返回true,否則返回false
*/
public static boolean deleteFile(String fileName) {
File file = new File(fileName);
// 如果檔案路徑所對應的檔案存在,並且是一個檔案,則直接刪除
if (file.exists() && file.isFile()) {
if (file.delete()) {
logger.info("刪除單個檔案" + fileName + "成功!");
return true;
} else {
logger.warn("刪除單個檔案" + fileName + "失敗!");
System.out.println("刪除單個檔案" + fileName + "失敗!");
return false;
}
} else {
logger.warn("刪除單個檔案失敗:" + fileName + "不存在!");
System.out.println("刪除單個檔案失敗:" + fileName + "不存在!");
return false;
}
}
public static boolean deleteDirectory(String dir) {
// 如果dir不以檔案分隔符結尾,自動新增檔案分隔符
if (!dir.endsWith(File.separator))
dir = dir + File.separator;
File dirFile = new File(dir);
// 如果dir對應的檔案不存在,或者不是一個目錄,則退出
if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
logger.warn("刪除目錄失敗:" + dir + "不存在!");
System.out.println("刪除目錄失敗:" + dir + "不存在!");
return false;
}
boolean flag = true;
// 刪除資料夾中的所有檔案包括子目錄
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) {
// 刪除子檔案
if (files[i].isFile()) {
flag = FileUtil.deleteFile(files[i].getAbsolutePath());
if (!flag)
break;
}
// 刪除子目錄
else if (files[i].isDirectory()) {
flag = FileUtil.deleteDirectory(files[i]
.getAbsolutePath());
if (!flag)
break;
}
}
if (!flag) {
System.out.println("刪除目錄失敗!");
logger.warn("刪除目錄失敗!");
return false;
}
// 刪除當前目錄
if (dirFile.delete()) {
logger.info("刪除目錄" + dir + "成功!");
return true;
} else {
return false;
}
}
// 建立目錄
public static boolean createDir(String destDirName) {
File dir = new File(destDirName);
if (dir.exists()) {// 判斷目錄是否存在
logger.warn("建立目錄失敗,目標目錄已存在!");
System.out.println("建立目錄失敗,目標目錄已存在!");
return false;
}
if (!destDirName.endsWith(File.separator)) {// 結尾是否以"/"結束
destDirName = destDirName + File.separator;
}
if (dir.mkdirs()) {// 建立目標目錄
logger.info("建立目錄成功!" + destDirName);
return true;
} else {
logger.warn("建立目錄失敗!");
System.out.println("建立目錄失敗!");
return false;
}
}
public static void clearDir(String dir) {
FileUtil.delete(dir);
FileUtil.createDir(dir);
}
}
9.FtpUtil.java
package sz.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;
public class FtpUtil {
private static Logger logger = Logger.getLogger(FtpUtil.class);
public static boolean uploadFile(String host, int port, String username, String password, String basePath,
String filePath, String filename, InputStream input) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);// 連線FTP伺服器
// 如果採用預設埠,可以使用ftp.connect(host)的方式直接連線FTP伺服器
ftp.login(username, password);// 登入
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
//切換到上傳目錄
if (!ftp.changeWorkingDirectory(basePath + filePath)) {
//如果目錄不存在建立目錄
String[] dirs = filePath.split("/");
String tempPath = basePath;
for (String dir : dirs) {
if (null == dir || "".equals(dir)) continue;
tempPath += "/" + dir;
if (!ftp.changeWorkingDirectory(tempPath)) {
if (!ftp.makeDirectory(tempPath)) {
return result;
} else {
ftp.changeWorkingDirectory(tempPath);
}
}
}
}
//設定上傳檔案的型別為二進位制型別 .BINARY_FILE_TYPE
ftp.setFileType(FTP.ASCII_FILE_TYPE);
//上傳檔案
if (!ftp.storeFile(filename, input)) {
return result;
}
input.close();
ftp.logout();
result = true;
} catch (IOException e) {
System.out.println(e.getMessage());
logger.error("uploadFile error!", e);
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
/**
* Description: 從FTP伺服器下載檔案
* @param host FTP伺服器hostname
* @param port FTP伺服器埠
* @param username FTP登入賬號
* @param password FTP登入密碼
* @param remotePath FTP伺服器上的相對路徑
* @param fileName 要下載的檔名
* @param localPath 下載後儲存到本地的路徑
* @return
*/
public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
String fileName, String localPath) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.connect(host, port);
// 如果採用預設埠,可以使用ftp.connect(host)的方式直接連線FTP伺服器
ftp.login(username, password);// 登入
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return result;
}
ftp.changeWorkingDirectory(remotePath);// 轉移到FTP伺服器目錄
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(fileName)) {
File localFile = new File(localPath + "/" + ff.getName());
OutputStream is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is);
is.close();
}
}
ftp.logout();
result = true;
} catch (IOException e) {
logger.error("downloadFile error!", e);
System.out.println(e.getMessage());
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
}
10.ParaFileUtil.java
package sz.util;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Properties;
import org.apache.log4j.Logger;
public class ParaFileUtil {
private static Logger logger = Logger.getLogger(ParaFileUtil.class);
static String paraFileName = "config.properties";
public static String getPropertyValue(String fieldName) {
String propertyValue = "";
Properties prop = new Properties();
try {
InputStream in = new BufferedInputStream(new FileInputStream(paraFileName));
prop.load(in);
Iterator<String> it = prop.stringPropertyNames().iterator();
while (it.hasNext()) {
String key = it.next();
if (fieldName.contentEquals(key)) {
propertyValue = prop.getProperty(key);
}
}
in.close();
} catch (Exception e) {
System.out.println(e);
logger.error("get property value error.", e);
}
return propertyValue;
}
}
如果您喜歡我的文章,別忘了點贊和留言哦!