Java 實現 FTP 服務器的文件上傳和下載

前言

因爲業務需求,須要實現 ftp server 的文件上傳和下載功能。因而便藉助了 apache 的一個工具包 commons-net。使用起來很簡單,可是有些細節比較坑,特此說明一下。linux

使用

第三方包的核心工具類是 FTPClient ,無論是文件上傳仍是文件下載,都要進行鏈接和登陸,具體會在代碼中體現出來。apache

準備工做

引入 maven 依賴服務器

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>

ftp 服務器的鏈接信息maven

  • 主機名
  • 端口
  • 用戶名
  • 密碼

若是須要本身搭建和配置文件服務器,請自行百度工具

經常使用命令
    rm -rf            目錄名稱
    mkdir 目錄名稱     建立目錄
    touch 文件名       新建文件
    cd 目錄名稱         切換目錄
    kill -9 進程ID      殺死進程
    chmod              配置權限

文件上傳

文件上傳其實就是把咱們本地的文件,放到文件服務器指定的目錄下。 想象一下,若是咱們此時在一臺 linux 服務器上新建一個文件夾和文件,該如何操做?優化

  1. 建立文件夾 mkdir 文件夾名稱
  2. 進入到文件夾中 cd 文件夾名稱
  3. 新建文件 touch 文件名稱

其實 FTPClient 實現文件上傳的代碼也是這個意思,其中用到的方法主要是:編碼

  1. makeDirectory(path)
  2. changeWorkingDirectory(path)
  3. storeFile(remoteFilename, inputStream);

分別對應上面的三個步驟。code

如下是完整代碼,可是有幾個細節須要說明:server

  1. 確保登陸用戶擁有足夠的權限,好比讀寫文件。進程

  2. makeDirectory 方法沒法建立多級目錄,只能一層一層建立。

  3. 建立文件失敗多是用戶沒有權限,也多是目錄已存在。

  4. 中文亂碼問題看代碼

    public static void main(String[] args) {
         FTPClient ftpClient = new FTPClient();
         try {
     	    // 1. 鏈接登陸
     	    ftpClient.connect("主機名", 端口);
     	    boolean loginSuccessful = ftpClient.login("用戶名", "密碼!");
     	    System.out.println(loginSuccessful ? "登陸成功" : "登陸失敗");
    
     	    String remotePath = "中文目錄";// 上傳的文件所在目錄
     	    String remotePathAfterTransferCode = new String(remotePath.getBytes("utf-8"), "iso-8859-1");// 防止中文亂碼
     	    String localFile = "/Users/zzz/Desktop/ftp-server/perfect.txt";// 本地待上傳的文件
     	    String remoteFilename = "remoteFile.txt";// 上傳後 ftp server 的文件名稱
    
     	    // 2. 在 ftp server 上建立文件夾
     	    boolean makeDirSuccessful = ftpClient.makeDirectory(remotePathAfterTransferCode);
     	    System.out.println("建立文件夾是否成功? " + makeDirSuccessful);
    
     	    // 3. 切換目錄
     	    boolean changeWorkingDirectorySuccessful = ftpClient.changeWorkingDirectory(remotePathAfterTransferCode);
     	    System.out.println(changeWorkingDirectorySuccessful ? "切換目錄成功" : "切換目錄失敗");
    
     	    // 4. 上傳本地文件到 ftp server
     	    boolean uploadSuccessful = ftpClient.storeFile(remoteFilename, new FileInputStream(new File(localFile)));
     	    System.out.println(uploadSuccessful ? "上傳成功" : "上傳失敗");
    
     	    // 5. 退出登陸
     	    ftpClient.logout();
         } catch (Exception e) {
     	    e.printStackTrace();
         }
    }

文件下載

文件下載也是須要用戶先鏈接登陸,而後才能下載。

核心方法就是 retrieveFile("服務器文件地址", 輸出流);

具體代碼以下:

public static void main(String[] args) {
    FTPClient ftpClient = new FTPClient();
    // 指定本地下載目錄
    String localPath = "/Users/zzz/Desktop/ftp-server";
    try {
        ftpClient.connect("主機名", 21);
        boolean loginSuccess = ftpClient.login("用戶名", "密碼!");
        System.out.println(loginSuccess ? "登陸成功" : "登陸失敗");

        // 文件下載
        File localFile = new File(localPath + File.separatorChar + "ttt.txt");
        OutputStream os = new FileOutputStream(localFile);
        boolean downloadSuccessful = ftpClient.retrieveFile("test.txt", os);

        os.close();
        System.out.println(downloadSuccessful ? "下載成功!" : "下載失敗!");

        ftpClient.logout();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

總結

FTPClient 實現文件上傳和下載的方法很簡單易懂,只是有些細節須要注意(常見的前面已經提到),固然上述的代碼只是 demo 版, 具體的需求還要去優化,好比異常處理,如何建立多級文件夾之類的,最後就是須要定製配置 FTPClient ,好比編碼之類的, 具體 API 自行查閱資料。

相關文章
相關標籤/搜索