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)文章
Java中通過jsch來連接遠(yuǎn)程服務(wù)器執(zhí)行l(wèi)inux命令
這篇文章主要介紹了Java中通過jsch來連接遠(yuǎn)程服務(wù)器執(zhí)行l(wèi)inux命令的相關(guān)資料,需要的朋友可以參考下2016-03-03springboot后端存儲富文本內(nèi)容的思路與步驟(含圖片內(nèi)容)
在所有的編輯器中,大概最受歡迎的就是富文本編輯器和MarkDown編輯器了,下面這篇文章主要給大家介紹了關(guān)于springboot后端存儲富文本內(nèi)容的思路與步驟的相關(guān)資料,需要的朋友可以參考下2023-04-04