欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

JAVA实现FTP断点上传,javaftp断点,主要使用apache中的

来源: javaer 分享于  点击 24864 次 点评:167

JAVA实现FTP断点上传,javaftp断点,主要使用apache中的


主要使用apache中的net包来实现。网址http://commons.apache.org/net/。具体包的下载和API文档请看官网。

断点上传就是在上传的过程中设置传输的起始位置。并设置二进制传输。

[Java]代码

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());           }       }   }
相关栏目:

用户点评