JAVA实现FTP断点上传的方法_java

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, ftp
断点上传
java实现ftp断点续传、java实现上传断点续传、java实现ftp上传下载、java实现ftp上传文件、java实现ftp上传,以便于您获取更多的相关知识。

时间: 2024-10-30 03:36:18

JAVA实现FTP断点上传的方法_java的相关文章

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

本文实例为大家分享了两种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实现ftp文件上传下载解决慢中文乱码多个文件下载等问题_java

废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String path,String filename,InputStream input) { boolean success=false; FTPClient ftp=new FTPClient();//org.apache.commons.net.ftp

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

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

Java实现文件上传的方法_java

本文实例为大家分享了Java实现文件上传的具体代码,具体内容如下 1.java代码: package com.github.reston.servlet; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import java.util.List; import javax

java实现分段读取文件并通过HTTP上传的方法_java

本文实例讲述了java实现分段读取文件并通过HTTP上传的方法.分享给大家供大家参考.具体如下: 1.首先将文件分段,用RandomAccessFile 2.分段后将分出的内容上传到http URL url = new URL(actionUrl); HttpURLConnection con = (HttpURLConnection) url.openConnection(); /** 允许Input.Output,不使用Cache */ con.setDoInput(true); con.s

基于html5+java实现大文件上传实例代码_java

废话不多说了,直接给大家贴代码了,具体代码如下所示: html代码如下: <body> <input id="fileid" type="file" accept="video/*;capture=camera" onchange="onfile(this)"> <input id="btn" type="button" value="提交&quo

java组件smartupload实现上传文件功能_java

使用jsp和serlvet来实现最简单的上传,供大家参考,具体内容如下 1.页面index.jsp <%@ page language="java" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":

java 用ftp文件上传

问题描述 用ftp把文件从我的机器传到另一台机器,对方的机器用作什么么?谢谢大家有点急 解决方案 这个...ftp应该是装在对方的机子吧,然后你在去操作他的ftp,把文件传过去啊解决方案二:对方的机器用作ftp服务器

ftp服务器上传文件-FTP上传时出现out空指针

问题描述 FTP上传时出现out空指针 OutputStream out = ftpClient.appendFileStream(new String(remoteFile.getBytes("GBK"), "iso-8859-1")); 我使用ftp断点上传两份文件,第一份全英文的通过,第二份在文件名中存在中文,上面这句话就会出现out空指针,求大神指点 解决方案 可能是编码,换成utf-8试试