JAVA完成FTP斷點上傳的辦法。本站提示廣大學習愛好者:(JAVA完成FTP斷點上傳的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是JAVA完成FTP斷點上傳的辦法正文
本文實例講述了JAVA完成FTP斷點上傳的辦法。分享給年夜家供年夜家參考。詳細剖析以下:
這裡重要應用apache中的net包來完成。網址http://commons.apache.org/net/。詳細包的下載和API文檔請看官網。 斷點上傳就是在上傳的進程中設置傳輸的肇端地位。並設置二進制傳輸。
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 */ 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 */ 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.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法式設計有所贊助。