欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JAVA實現(xiàn)FTP斷點上傳的方法

 更新時間:2015年06月18日 09:51:05   作者:瘋狂的流浪  
這篇文章主要介紹了JAVA實現(xiàn)FTP斷點上傳的方法,涉及java使用FTP實現(xiàn)文件傳輸?shù)南嚓P(guān)技巧,需要的朋友可以參考下

本文實例講述了JAVA實現(xiàn)FTP斷點上傳的方法。分享給大家供大家參考。具體分析如下:

這里主要使用apache中的net包來實現(xiàn)。網(wǎng)址http://commons.apache.org/net/。具體包的下載和API文檔請看官網(wǎng)。 斷點上傳就是在上傳的過程中設(shè)置傳輸?shù)钠鹗嘉恢谩2⒃O(shè)置二進制傳輸。

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(){ 
     //設(shè)置將過程中使用到的命令輸出到控制臺 
     this.ftpClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out))); 
   } 
   /** 
   * java編程中用于連接到FTP服務(wù)器 
   * @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服務(wù)器上下載文件 
   * @param remote 遠(yuǎn)程文件路徑 
   * @param local 本地文件路徑 
   * @return 是否成功 
   * @throws IOException 
   */ 
   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("遠(yuǎn)程文件不唯一"); 
       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("本地文件大小大于遠(yuǎn)程文件大小,下載中止"); 
         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服務(wù)器,支持?jǐn)帱c續(xù)傳 
   * @param local 本地文件名稱,絕對路徑 
   * @param remote 遠(yuǎn)程文件路徑,使用/home/directory1/subdirectory/file.ext 按照Linux上的路徑指定方式,支持多級目錄嵌套,支持遞歸創(chuàng)建不存在的目錄結(jié)構(gòu) 
   * @return 上傳結(jié)果 
   * @throws IOException 
   */ 
   public UploadStatus upload(String local,String remote) throws IOException{ 
     //設(shè)置PassiveMode傳輸 
     ftpClient.enterLocalPassiveMode(); 
     //設(shè)置以二進制流的方式傳輸 
     ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 
     UploadStatus result; 
     //對遠(yuǎn)程目錄的處理 
     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)){ 
         //如果遠(yuǎn)程目錄不存在,則遞歸創(chuàng)建遠(yuǎn)程服務(wù)器目錄 
         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("創(chuàng)建目錄失敗"); 
               return UploadStatus.Create_Directory_Fail;
             } 
           } 
           start = end + 1; 
           end = directory.indexOf("/",start); 
           //檢查所有目錄是否創(chuàng)建完畢 
           if(end <= start){ 
             break; 
           } 
         } 
       } 
     } 
     //檢查遠(yuǎn)程是否存在文件 
     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; 
       } 
       //嘗試移動文件內(nèi)讀取指針,實現(xiàn)斷點續(xù)傳 
       InputStream is = new FileInputStream(f); 
       if(is.skip(remoteSize)==remoteSize){ 
         ftpClient.setRestartOffset(remoteSize); 
         if(ftpClient.storeFile(remote, is)){ 
           return UploadStatus.Upload_From_Break_Success; 
         } 
       } 
       //如果斷點續(xù)傳沒有成功,則刪除服務(wù)器上文件,重新上傳 
       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; 
   } 
   /** 
   * 斷開與遠(yuǎn)程服務(wù)器的連接 
   * @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.21.171", 21, "test", "test"); 
       System.out.println(myFtp.upload("E:\\VP6.flv", "/MIS/video/VP6.flv")); 
       myFtp.disconnect(); 
     } catch (IOException e) { 
       System.out.println("連接FTP出錯:"+e.getMessage()); 
     } 
   } 
}

希望本文所述對大家的java程序設(shè)計有所幫助。

相關(guān)文章

  • sin(x)如何求解的java代碼實現(xiàn)方法

    sin(x)如何求解的java代碼實現(xiàn)方法

    這篇文章主要為大家介紹了sin(x)如何求解的java代碼實現(xiàn)方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Java中通過jsch來連接遠(yuǎn)程服務(wù)器執(zhí)行l(wèi)inux命令

    Java中通過jsch來連接遠(yuǎn)程服務(wù)器執(zhí)行l(wèi)inux命令

    這篇文章主要介紹了Java中通過jsch來連接遠(yuǎn)程服務(wù)器執(zhí)行l(wèi)inux命令的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • vue 實現(xiàn)刪除對象的元素 delete

    vue 實現(xiàn)刪除對象的元素 delete

    這篇文章主要介紹了vue 實現(xiàn)刪除對象的元素delete,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 一篇文章帶你復(fù)習(xí)java知識點

    一篇文章帶你復(fù)習(xí)java知識點

    以下簡單介紹了下我對于這些java基本知識點和技術(shù)點的一些看法和心得,這些內(nèi)容都源自于我這些年來使用java的一些總結(jié),希望能夠給你帶來幫助
    2021-06-06
  • SpringBoot 如何自定義項目啟動信息打印

    SpringBoot 如何自定義項目啟動信息打印

    這篇文章主要介紹了SpringBoot 如何自定義項目啟動信息打印方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java讓多線程按順序執(zhí)行的幾種方法

    Java讓多線程按順序執(zhí)行的幾種方法

    本文主要介紹了Java讓多線程按順序執(zhí)行的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • mybatis如何返回某列的最大值

    mybatis如何返回某列的最大值

    這篇文章主要介紹了mybatis如何返回某列的最大值操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • springboot后端存儲富文本內(nèi)容的思路與步驟(含圖片內(nèi)容)

    springboot后端存儲富文本內(nèi)容的思路與步驟(含圖片內(nèi)容)

    在所有的編輯器中,大概最受歡迎的就是富文本編輯器和MarkDown編輯器了,下面這篇文章主要給大家介紹了關(guān)于springboot后端存儲富文本內(nèi)容的思路與步驟的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 初次使用IDEA創(chuàng)建maven項目的教程

    初次使用IDEA創(chuàng)建maven項目的教程

    這篇文章主要介紹了初次使用IDEA創(chuàng)建maven項目的教程講解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 深入理解Struts2國際化信息機制

    深入理解Struts2國際化信息機制

    本篇文章主要介紹了深入理解Struts2國際化信息機制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07

最新評論