国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java基于Apache FTP點斷續傳的文件上傳和下載

2019-11-26 13:38:10
字體:
來源:轉載
供稿:網友

基于Apache FTP實現文件上傳下載工具 ,上傳文件時需要考慮以下問題(實例是續傳功能):

(1)、 FTP服務器是否存在改目錄,如果不存在目錄則需要創建目錄。

(2)、判斷上傳文件是否已經存在,如果存在是需要刪除后再上傳還是續傳。

1、上傳或下載狀態的枚舉類:

package com.scengine.wtms.utils.ftp;  public enum UploadStatus {   File_Exits(0), Create_Directory_Success(1), Create_Directory_Fail(2), Upload_From_Break_Success(3), Upload_From_Break_Faild(4), Download_From_Break_Success(5), Download_From_Break_Faild(6), Upload_New_File_Success(7), Upload_New_File_Failed(8), Delete_Remote_Success(9), Delete_Remote_Faild(10),Remote_Bigger_Local(11),Remote_smaller_locall(12);    private int status;    public int getStatus()   {     return status;   }    public void setStatus(int status)   {     this.status = status;   }    UploadStatus(int status)   {     this.status = status;   } } 

2、工具類代碼:

package com.scengine.wtms.utils.ftp;  import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import org.apache.commons.net.PrintCommandListener; 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;  public class ContinueFTP {    private FTPClient ftpClient = new FTPClient();    /**    * 對象構造 設置將過程中使用到的命令輸出到控制臺    */   public ContinueFTP()   {     this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));   }    /**    *    * java編程中用于連接到FTP服務器    *    * @param hostname    *      主機名    *    * @param port    *      端口    *    * @param username    *      用戶名    *    * @param password    *      密碼    *    * @return 是否連接成功    *    * @throws IOException    */    public boolean connect(String hostname, int port, String username, String password) throws IOException   {      ftpClient.connect(hostname, port);      if (FTPReply.isPositiveCompletion(ftpClient.getReplyCode()))     {        if (ftpClient.login(username, password))       {         return true;       }     }     disconnect();     return false;    }    /**    *    * 從FTP服務器上下載文件    *    * @param remote    *      遠程文件路徑    *    * @param local    *      本地文件路徑    *    * @return 是否成功    *    * @throws IOException    */    @SuppressWarnings("resource")   public boolean download(String remote, String local) throws IOException   {      ftpClient.enterLocalPassiveMode();      ftpClient.setFileType(FTP.BINARY_FILE_TYPE);      boolean result;      File f = new File(local);      FTPFile[] files = ftpClient.listFiles(remote);      if (files.length != 1)     {       System.out.println("遠程文件不唯一");       return false;     }      long lRemoteSize = files[0].getSize();      if (f.exists())     {       OutputStream out = new FileOutputStream(f, true);       System.out.println("本地文件大小為:" + f.length());        if (f.length() >= lRemoteSize)       {          System.out.println("本地文件大小大于遠程文件大小,下載中止");          return false;        }        ftpClient.setRestartOffset(f.length());        result = ftpClient.retrieveFile(remote, out);        out.close();      } else     {        OutputStream out = new FileOutputStream(f);       result = ftpClient.retrieveFile(remote, out);       out.close();     }      return result;    }    /**    *    * 上傳文件到FTP服務器,支持斷點續傳    *    * @param local    *      本地文件名稱,絕對路徑    *    * @param remote    *      遠程文件路徑,使用/home/directory1/subdirectory/file.ext    *      按照Linux上的路徑指定方式,支持多級目錄嵌套,支持遞歸創建不存在的目錄結構    *    * @return 上傳結果    *    * @throws IOException    */    @SuppressWarnings("resource")   public UploadStatus upload(String local, String remote) throws IOException   {      // 設置PassiveMode傳輸      ftpClient.enterLocalPassiveMode();      // 設置以二進制流的方式傳輸      ftpClient.setFileType(FTP.BINARY_FILE_TYPE);      UploadStatus result;      // 對遠程目錄的處理      String remoteFileName = remote;      if (remote.contains("/"))     {        remoteFileName = remote.substring(remote.lastIndexOf("/") + 1);        String directory = remote.substring(0, remote.lastIndexOf("/") + 1);        if (!directory.equalsIgnoreCase("/") && !ftpClient.changeWorkingDirectory(directory))       {          // 如果遠程目錄不存在,則遞歸創建遠程服務器目錄          int start = 0;          int end = 0;          if (directory.startsWith("/"))         {            start = 1;          } else         {            start = 0;          }          end = directory.indexOf("/", start);          while (true)         {            String subDirectory = remote.substring(start, end);            if (!ftpClient.changeWorkingDirectory(subDirectory))           {              if (ftpClient.makeDirectory(subDirectory))             {                ftpClient.changeWorkingDirectory(subDirectory);              } else             {                System.out.println("創建目錄失敗");                return UploadStatus.Create_Directory_Fail;              }            }            start = end + 1;            end = directory.indexOf("/", start);            // 檢查所有目錄是否創建完畢            if (end <= start)           {              break;            }          }        }      }      // 檢查遠程是否存在文件      FTPFile[] files = ftpClient.listFiles(remoteFileName);      if (files.length == 1)     {        long remoteSize = files[0].getSize();        File f = new File(local);        long localSize = f.length();        if (remoteSize == localSize)       {          return UploadStatus.File_Exits;        } else if (remoteSize > localSize)       {          return UploadStatus.Remote_Bigger_Local;        }        // 嘗試移動文件內讀取指針,實現斷點續傳        InputStream is = new FileInputStream(f);        if (is.skip(remoteSize) == remoteSize)       {          ftpClient.setRestartOffset(remoteSize);          if (ftpClient.storeFile(remote, is))         {            return UploadStatus.Upload_From_Break_Success;          }        }        // 如果斷點續傳沒有成功,則刪除服務器上文件,重新上傳        if (!ftpClient.deleteFile(remoteFileName))       {          return UploadStatus.Delete_Remote_Faild;        }        is = new FileInputStream(f);        if (ftpClient.storeFile(remote, is))       {          result = UploadStatus.Upload_New_File_Success;        } else       {          result = UploadStatus.Upload_New_File_Failed;        }        is.close();      } else     {        InputStream is = new FileInputStream(local);        if (ftpClient.storeFile(remoteFileName, is))       {          result = UploadStatus.Upload_New_File_Success;        } else       {          result = UploadStatus.Upload_New_File_Failed;        }        is.close();     }      return result;    }    /**    *    * 斷開與遠程服務器的連接    *    * @throws IOException    */    public void disconnect() throws IOException   {      if (ftpClient.isConnected())     {       ftpClient.disconnect();     }    }    public static void main(String[] args)   {     ContinueFTP myFtp = new ContinueFTP();     try     {        myFtp.connect("192.168.1.200", 21, "duser", "HTPDuserXP32");        System.out.println(myFtp.upload("C://Users//Administrator//Desktop//swing.drawer.jar", "/jars/swing.drawer.jar"));        myFtp.disconnect();      } catch (IOException e)     {        System.out.println("連接FTP出錯:" + e.getMessage());      }    }  } 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 顺昌县| 泗洪县| 遂溪县| 阳西县| 太仓市| 镇原县| 灌阳县| 镇原县| 都昌县| 五莲县| 从江县| 鄄城县| 达日县| 文成县| 马关县| 康马县| 东乡族自治县| 旌德县| 桃园县| 阳谷县| 临湘市| 洪雅县| 砚山县| 临夏县| 河东区| 穆棱市| 铅山县| 宁海县| 陕西省| 萨迦县| 广州市| 东阳市| 民勤县| 恩施市| 长海县| 祁东县| 社会| 玉树县| 灵台县| 武隆县| 德令哈市|