1. 程式人生 > >週期性上傳檔案到ftp服務端指定路徑功能實現

週期性上傳檔案到ftp服務端指定路徑功能實現

程式的功能

       該程式實現週期性的從本地指定路徑中獲取檔案及列表,上傳到指定的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;
    }
}

如果您喜歡我的文章,別忘了點贊和留言哦!