JAVA中使用FTPClient上傳下載

爆米花9958發表於2017-10-09
在JAVA程式中,經常需要和FTP打交道,比如向FTP伺服器上傳檔案、下載檔案,本文簡單介紹如何利用jakarta commons中的FTPClient(在commons-net包中)實現上傳下載檔案,我建立的是mvn專案,所以在pom.xml檔案中新增依賴:
<!-- https://mvnrepository.com/artifact/commons-net/commons-net -->
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/oro/oro -->
<dependency>
    <groupId>oro</groupId>
    <artifactId>oro</artifactId>
    <version>2.0.8</version>
</dependency>

自己寫程式碼前可以先看下官方的API,官網寫的還是很詳細的(http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html),簡單截個圖看下:

好了,簡單寫個例子,很簡單,一看就明白了
/**
 * 向FTP伺服器上傳檔案
 *
 * @param url        FTP伺服器url
 * @param port       FTP伺服器埠
 * @param username
 * @param password
 * @param path       本地檔案目錄
 * @param remoteFile FTP伺服器儲存檔名
 */
public void sendToServer(String url, int port, String username, String password,
                         String path, String remoteFile) {
    //建立ftp客戶端
    FTPClient ftpClient = new FTPClient();
    ftpClient.setControlEncoding("GBK");
    try {
        //連結ftp伺服器
        ftpClient.connect(url, port);
        //登入ftp
        ftpClient.login(username, password);
        int reply = ftpClient.getReplyCode();
        System.out.println(reply);
        //如果reply返回230就算成功了,如果返回530密碼使用者名稱錯誤或當前使用者無許可權下面有詳細的解釋。
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftpClient.disconnect();
            return;
        }
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

        ftpClient.changeWorkingDirectory("/data");//修改工作目錄
        File file = new File(path);
        InputStream input = new FileInputStream(file);
        ftpClient.storeFile(remoteFile, input);//檔名若是不指定就會上傳到root目錄下
        input.close();
        ftpClient.logout();

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }

    }

}

/**
 * Description: 從FTP伺服器下載檔案
 *
 * @param remotePath FTP伺服器上的相對路徑
 * @param fileName   要下載的檔名
 * @param localPath  下載後儲存到本地的路徑
 */
public static boolean download(String url, int port, String username, String password,
                               String remotePath, String fileName, String localPath) {
    boolean success = false;
    //建立ftp客戶端
    FTPClient ftpClient = new FTPClient();
    ftpClient.setControlEncoding("GBK");
    try {
        int reply;
        ftpClient.connect(url, port);
        //如果採用預設埠,可以使用ftpClient.connect(url)的方式直接連線FTP伺服器
        ftpClient.login(username, password);//登入
        reply = ftpClient.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftpClient.disconnect();
            return false;
        }
        ftpClient.changeWorkingDirectory(remotePath);//轉移到FTP伺服器目錄
        FTPFile[] fs = ftpClient.listFiles();
        for (FTPFile ff : fs) {
            if (ff.getName().equals(fileName)) {
                File localFile = new File(localPath + "/" + ff.getName());

                OutputStream is = new FileOutputStream(localFile);
                ftpClient.retrieveFile(ff.getName(), is);
                is.close();
            }
        }

        ftpClient.logout();
        success = true;
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (ftpClient.isConnected()) {
            try {
                ftpClient.disconnect();
            } catch (IOException ioe) {
            }
        }
    }
    return success;
}

參考:


相關文章