首页 > 编程 > Java > 正文

JAVA实现FTP断点上传的方法

2019-11-26 15:08:17
字体:
来源:转载
供稿:网友

本文实例讲述了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程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表