主要使用apache中的net包來實作。網址http://commons.apache.org/net/。具體包的下載下傳和API文檔請看官網。
斷點上傳就是在上傳的過程中設定傳輸的起始位置。并設定二進制傳輸。
Java代碼
- package apache.net.test;
- 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)));
- }
- 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;
- }
- 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;
- }
- 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;
- }
- 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());
- }
- }
- }