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程序设计有所帮助。

(0)

相关推荐

  • Java实现FTP批量大文件上传下载篇1

    本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比较通用且功能较强的j-ftp类库,对一些比较常见的功能如进度条.断点续传.内外网的映射.在Applet中回调JavaScript函数等问题进行详细的阐述及代码实现,希望通过此文起到一个抛砖引玉的作用. 一.引子 笔者在实施一个项目过程中出现了一种基于Web的文件上传下载需求.在全省(或全国)各地的用

  • Java通过FTP服务器上传下载文件的方法

    对于使用文件进行交换数据的应用来说,使用FTP 服务器是一个很不错的解决方案. 关于FileZilla Server服务器的详细搭建配置过程,详情请见FileZilla Server安装配置教程.之前有朋友说,上传大文件(几百M以上的文件)到FTP服务器时会重现无法重命名的问题,但本人亲测上传2G的文件到FileZilla Server都没有该问题,朋友们可以放心使用该代码. FavFTPUtil.Java package com.favccxx.favsoft.util; import jav

  • java实现将文件上传到ftp服务器的方法

    本文实例讲述了java实现将文件上传到ftp服务器的方法.分享给大家供大家参考,具体如下: 工具类: package com.fz.common.util; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; imp

  • Java实现ftp上传下载、删除文件及在ftp服务器上传文件夹的方法

    一个JAVA 实现FTP功能的代码,包括了服务器的设置模块,并包括有上传文件至FTP的通用方法.下载文件的通用方法以及删除文件.在ftp服务器上传文件夹.检测文件夹是否存在等,里面的有些代码对编写JAVA文件上传或许有参考价值,Java FTP主文件代码: package ftpDemo; import java.io.DataOutputStream; import java.io.InputStream; import java.io.OutputStream; import sun.net

  • java实现FTP文件上传与文件下载

    本文实例为大家分享了两种java实现FTP文件上传下载的方式,供大家参考,具体内容如下 第一种方式: package com.cloudpower.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import sun.net.TelnetInputStream; import sun.net.TelnetO

  • Java中FTPClient上传中文目录、中文文件名乱码问题解决方法

    问题描述: 使用org.apache.commons.net.ftp.FTPClient创建中文目录.上传中文文件名时,目录名及文件名中的中文显示为"??". 原因: FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码. 解决方案: 1.将中文的目录或文件名转为iso-8859-1编码的字符.参考代码: 复制代码 代码如下: String name="目录名或文件名"; name=new String(name.getBytes(&qu

  • Java语言实现简单FTP软件 FTP软件效果图预览之上传功能(3)

    下面展示一下FTP软件上传功能的过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.上传前 上传前选择好要将文件或文件夹上传到远程FTP服务器的哪个目的目录下. 2.上传中 添加上传任务 上传任务完成进度显示 3.上传完成 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • JAVA中使用FTPClient实现文件上传下载实例代码

    在java程序开发中,ftp用的比较多,经常打交道,比如说向FTP服务器上传文件.下载文件,本文给大家介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 一.上传文件 原理就不介绍了,大家直接看代码吧 /** * Description: 向FTP服务器上传文件 * @Version1.0 Jul 27, 2008 4:31:09 PM by 崔红保(cuihongbao@d-heaven.com)创建 * @param url F

  • JAVA技术实现上传下载文件到FTP服务器(完整)

    具体详细介绍请看下文: 在使用文件进行交互数据的应用来说,使用FTP服务器是一个很好的选择.本文使用Apache Jakarta Commons Net(commons-net-3.3.jar) 基于FileZilla Server服务器实现FTP服务器上文件的上传/下载/删除等操作. 关于FileZilla Server服务器的详细搭建配置过程,详情请见 FileZilla Server安装配置教程 .之前有朋友说,上传大文件(几百M以上的文件)到FTP服务器时会重现无法重命名的问题,但本人亲

  • java使用ftp上传文件示例分享

    复制代码 代码如下: import java.io.ByteArrayInputStream;  import java.io.FileOutputStream;  import java.io.IOException;  import java.net.SocketException;  import java.text.SimpleDateFormat;  import java.util.Date; import org.apache.commons.io.IOUtils;  import

随机推荐